user-0 提问: c语言socket通讯 服务端问题

回复:
user: user-1
content: 给你写个服务器多客户多线程通讯的方式： while（true）{     socket=accept();     分配一个线程：如  new 线程名(socket); } 然后将事件交给线程来处理就行了

user: user-2
content: 不要死板硬套，换个思路，用UDP做多线程，这样就行了

user: user-3
content: 服务端 要么迭代，要么并发的，并发的方法是多进程（接受一个请求就创建一个新进程处理这个请求）或者多线程（接受一个请求就创建一个新线程处理这个请求），或者是线程池进程池。  你的做法就是多线程，但是重复写6次accept肯定是不好的,下面这样就能不限制连接数，但是超过最大线程数不行   while(1)  {              c1 = accept( s, (sockaddr*) &addr, NULL );             if(SOCKET_ERROR != c1)              {                 _beginthreadex(NULL, 0, recv1, NULL, NULL, (PVOID)c1);              } }

user: user-0
content: _beginthreadex(NULL, 0, recv2, NULL, NULL, &tid); 这个是用来recv() 的就是一个线程recv() 一个客户端 全部代码：  #include<stdio.h> #include<winsock2.h> #include<conio.h> #include <process.h> #include<windows.h> #pragma comment(lib, "ws2_32.lib")  unsigned tid; sockaddr_in addr; char buf[1024]={0}; SOCKET nes; SOCKET s; SOCKET c1; SOCKET c2; SOCKET c3; SOCKET c4; SOCKET c5;  unsigned WINAPI recv1(PVOID pvParam) { 	while(1) 	{ 		puts("c1进入:"); 		recv(c1,buf,sizeof(buf),0); 		puts(buf); 	} 	return 0; }  unsigned WINAPI recv2(PVOID pvParam) { 	while(1) 	{ 		puts("c2进入:"); 		recv(c2,buf,sizeof(buf),0); 		puts(buf); 	} 	return 0; }  unsigned WINAPI recv3(PVOID pvParam) { 	while(1) 	{ 		puts("c3进入:"); 		recv(c3,buf,sizeof(buf),0); 		puts(buf); 	} 	return 0; }  unsigned WINAPI recv4(PVOID pvParam) { 	while(1) 	{ 		puts("c4进入:"); 		recv(c4,buf,sizeof(buf),0); 		puts(buf); 	} 	return 0; }  unsigned WINAPI recv5(PVOID pvParam) { 	while(1) 	{ 		puts("c5进入:"); 		recv(c5,buf,sizeof(buf),0); 		puts(buf); 	} 	return 0; }   int main() { 	WSADATA wsaData; 	WSAStartup( MAKEWORD(2,2), &wsaData ); 	 	s=socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); 	addr.sin_family = AF_INET;     addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );     addr.sin_port = htons(8000);  	bind( s, (sockaddr*) &addr, sizeof(addr)); 	puts("1"); 	listen( s, 5 );           	puts("5"); 	while(1) 	{ 		puts("6"); 			c1=accept( s, (sockaddr*) &addr, NULL ); 			if(SOCKET_ERROR != c1) 			 { 				puts("2"); 				_beginthreadex(NULL, 0, recv1, NULL, NULL, &tid); 			 } 			c2=accept( s, (sockaddr*) &addr, NULL ); 			if(SOCKET_ERROR != c2) 			 { 				 puts("2"); 				_beginthreadex(NULL, 0, recv2, NULL, NULL, &tid); 			 } 			c3=accept( s, (sockaddr*) &addr, NULL ); 			if(SOCKET_ERROR != c3) 			 { 				 puts("2"); 				_beginthreadex(NULL, 0, recv3, NULL, NULL, &tid); 			 } 			c4=accept( s, (sockaddr*) &addr, NULL ); 			if(SOCKET_ERROR != c4) 			 { 				 puts("2"); 				_beginthreadex(NULL, 0, recv4, NULL, NULL, &tid); 			 } 			c5=accept( s, (sockaddr*) &addr, NULL ); 			if(SOCKET_ERROR != c5) 			 { 				 puts("2"); 				_beginthreadex(NULL, 0, recv5, NULL, NULL, &tid); 			 } 	 	} 	/*_beginthreadex(NULL, 0, recvv, NULL, NULL, &tid);*/ 	getch(); 	return 8; }

user: user-3
content: 所有的链接都用上面代码不区分，把文件描述符传递给新建线程

user: user-0
content: 引用 2 楼 lgbxyz 的回复:服务端 要么迭代，要么并发的，并发的方法是多进程（接受一个请求就创建一个新进程处理这个请求）或者多线程（接受一个请求就创建一个新线程处理这个请求），或者是线程池进程池。  你的做法就是多线程，但是重复写6次accept肯定是不好的,下面这样就能不限制连接数，但是超过最大线程数不行   while(1)  {              c1 = accept( s, (sockaddr*) &addr, NULL );             if(SOCKET_ERROR != c1)              {                 _beginthreadex(NULL, 0, recv1, NULL, NULL, (PVOID)c1);              } }  链接一个客户端就要用一个套接字吗？

user: user-4
content: 先看一下网络编程的基础概念