socket简单多线程方式详解编程语言

#include <arpa/inet.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <string.h> 
#include <pthread.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
void* socketProcess(void* socket_desc ); 
 
int main(int argc, char const* argv[]) 
{ 
    int sock_desc,c,recv_len; 
    int *new_sock; 
    char client_message[512]; 
    struct sockaddr_in server,client; 
    sock_desc=socket(AF_INET,SOCK_STREAM,0); 
    if(sock_desc<0){ 
        puts("错误"); 
        return 1; 
    } 
    server.sin_addr.s_addr=INADDR_ANY; 
    server.sin_port=htons(8888); 
    server.sin_family=AF_INET; 
    if(bind(sock_desc,(struct sockaddr*)&server,sizeof(server))<0){ 
        puts("绑定错误"); 
    } 
    puts("绑定完成"); 
 
 
    listen(sock_desc,5); 
    puts("正在监听等待连接"); 
 
 
    while(1){ 
        new_sock=(int*)malloc(sizeof(int)); 
        *new_sock=accept(sock_desc,(struct sockaddr*)&client,(socklen_t* )&c); 
        pthread_t thread_id; 
        puts("接受请求"); 
        if(*new_sock!=-1){ 
            char ipv4addr[100]; 
             char addr_buf[INET_ADDRSTRLEN]; 
             socklen_t len; 
             if(getsockname(*new_sock,(struct sockaddr*)&client,&len)==-1) 
             { 
                 perror("gesockname err"); 
             } 
             printf("ip:%d/n",ntohs(client.sin_port)); 
            if(pthread_create(&thread_id,0,&socketProcess,(void*)new_sock)<0){//创建一个线程 
                perror("创建线程失败"); 
                return 1; 
            } 
            pthread_detach(thread_id);//线程分离 
        } 
        puts("新客户连接"); 
 
    } 
    puts("连接成功"); 
    return 0; 
} 
void* socketProcess(void* socket_desc ){ 
 int *csock = (int*)socket_desc; 
 
 
     char buffer[1024]; 
     int buffer_len = 1024; 
     int bytecount; 
 
     while(1){ 
         memset(buffer, 0, buffer_len); 
         if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){ 
             fprintf(stderr, "接收数据错误,错误代码: %d/n", errno); 
             close(*csock); 
             return(0); 
         } 
         printf("接收到字节数 %d/n接收字符串 /"%s/"/n", bytecount, buffer); 
         strcat(buffer, " SERVER ECHO/n"); 
 
         if((bytecount = send(*csock, buffer, strlen(buffer), 0))== -1){ 
             fprintf(stderr, "错误发送数据 %d/n", errno); 
             close(*csock); 
             return(0); 
         } 
 
         printf("发送字节数 %d/n", bytecount); 
     } 
     return 0; 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/11107.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论