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;
}
本文由用戶 fpwb4193 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!