| 
 
查看: 1237|回复: 16
 
 | 
socket的疑问。。
[复制链接]
 | 
 
 
 | 
 | 
 
我想试build 一个简单的dos based chat program, 
请问下,在client side那里,是没次send 一个msg 就要create 一个socket,send了然后close 掉,还是从头到尾都只用一个socket,在program结束才close 掉那个socket?  
 
我不会是很明白。。 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
发表于 24-11-2005 10:11 PM
|
显示全部楼层
 
 
 
| 
结束聊天了... 才 close 掉 socket, server 也一样. |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
 楼主 |
发表于 24-11-2005 11:01 PM
|
显示全部楼层
 
 
 
奇怪,为何只有第一次send的msg有收到,第二次就收不到了。。 
 
 
 
- // create socket 
 
 -         s = socket(AF_INET,SOCK_STREAM,0);
 
  
-         if(s==INVALID_SOCKET) 
 
 -         {
 
 -                 printf("Can't create socket\n");
 
 -                 sockEnd();
 
 -                 return 2;
 
 -         }
 
  
-         // send data 
 
 -         connect(s,(struct sockaddr *) &remote_addr,sizeof(struct sockaddr_in));
 
  
-         for (;;)
 
 -         {
 
 -         
 
 -                 scanf("%128[^\n]",msg);
 
 -                 FLUSH;
 
 -                                 
 
 -                 if(send(s,msg,strlen(msg),0)==-1) 
 
 -                 {
 
 -                         printf("Can't send message\n");  
 
 -                         
 
 -                         return 3;  
 
 -                 }
 
 -         
 
 -                 if (strcmp(msg,"quitclient")==0)
 
 -                 {
 
 -                         break;
 
 -                 }
 
 -         
 
 -         }
 
  
-         // close the channel 
 
 -         if(closesocket(s)) 
 
 -         {
 
 -                 printf("Error on closing socket\n");
 
 -                 return 4;
 
 -         }
 
  
  复制代码 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
 楼主 |
发表于 24-11-2005 11:18 PM
|
显示全部楼层
 
 
 
server side: 
 
 
- /* creates socket */
 
 -         s = socket(AF_INET,SOCK_STREAM,0);
 
  
-         if(s==INVALID_SOCKET) 
 
 -         {
 
 -                 printf("Can't create socket\n");
 
 -                 sockEnd();
 
 -                 return 2;
 
 -         }
 
  
 
-         /* links socket to address and port */
 
 -         if(bind(s,(struct sockaddr *) &any_addr, sizeof(struct sockaddr_in))) {  
 
 -        printf("Can't bind socket to address\n");  
 
 -        sockEnd();   
 
 -        return 3;  
 
 -         }  
 
 -         
 
  
-         
 
 -                 /* listens on port; maximum 5 requests pending */
 
 -                 listen(s,5);
 
 -         
 
 -         for(;;)
 
 -         {
 
 -                 /* when someone connects creates a new socket for data exchange */
 
 -                 ss=accept(s,(struct sockaddr *) &any_addr,&addrlen);
 
  
-                 if(ss==INVALID_SOCKET) {
 
 -                         perror("accept");
 
 -                         return 4;
 
 -                 }
 
 -                 serverThread(ss);
 
 -         
 
 -         }
 
  
-         if(closesocket(s)) 
 
 -         {
 
 -                 perror("closesocket");
 
 -                 return 5;
 
 -         }
 
 
  复制代码 
 
 
 
- void serverThread(SOCKET ss) 
 
 - {
 
  
-         pid_t pid;
 
 -         char buffer[BUFLEN];
 
 -         int rec;
 
 -         int addrlen;
 
  
-         addrlen=sizeof(struct sockaddr_in);
 
 -         pid=getpid();
 
 -         /* waits for incoming data */
 
 -         
 
 -                 rec=recv(ss,buffer,BUFLEN,0);
 
 -                 
 
 -                 if(rec==-1) 
 
 -                 {
 
 -                         printf("Can't receive messages\n");  
 
 -                         sockEnd();   
 
 -                         return ;  
 
 -                 }
 
 -                 
 
 -                 buffer[rec]=0x00; 
 
  
-                 if (strcmp(buffer,"quitserver")==0)
 
 -                 {
 
 -                         closesocket(ss);
 
 -                         exit(1);
 
 -                 }
 
 -                 
 
  
-                 
 
 -                 puts(buffer);
 
 -                         
 
 -         
 
  
-         /* close the channel */
 
 -         if(closesocket(ss)) 
 
 -                 printf("Error on closing socket\n");
 
 - }
 
  
  复制代码 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
发表于 24-11-2005 11:31 PM
|
显示全部楼层
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
 楼主 |
发表于 24-11-2005 11:48 PM
|
显示全部楼层
 
 
 
好象不行。。 
不过我试把recv 放在另一个infinite loop 里如下: 
 
- for (;;){
 
 -                 rec=recv(ss,buffer,BUFLEN,0);
 
 -                         
 
 -                 if(rec==-1) 
 
 -                 {
 
 -                         printf("Can't receive messages\n");  
 
 -                         sockEnd();   
 
 -                         return ;  
 
 -                 }
 
 -                 
 
 -                 buffer[rec]=0x00; //put null to end of string
 
  
-                 if (strcmp(buffer,"quitserver")==0)
 
 -                 {
 
 -                         closesocket(ss);
 
 -                         exit(1);
 
 -                 }
 
 -                 
 
 -                 puts(buffer);
 
  
-         }
 
 
  复制代码 
 
 
是可以不停的收msg。。不过第二个问题来了,如果我run两个client,这个server只收第一个client的msg,对第二client完全置之不理。。 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
		
 | 
 | 
 
 
发表于 25-11-2005 12:11 AM
|
显示全部楼层
 
 
 
原帖由 tensaix2j 于 24-11-2005 11:48 PM 发表 
好象不行。。 
不过我试把recv 放在另一个infinite loop 里如下: 
[code] 
for (; { 
                rec=recv(ss,buffer,BUFLEN,0); 
                         
                if(rec==-1)  
                { 
                        printf("Can't receive messages\n" ;   
                        s ...   
 
 
 
不同client , 在server 上要开新的socket。所以, 你应该用1个port 来listen , 另外一个port 来接受msg 。 
 
Server Algorithm  
 
   listen on port A 
   if (client request connection) 
   { 
     open a new port for connection  (accept) 
   } 
  
所以, 不同client 会bind 不同的port。 
不过DOS socket programming 应该有多线性的command 才能做到, 你需要找找看哪一个command 可以办到。for loop应该不是解决办法 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
 楼主 |
发表于 25-11-2005 12:27 AM
|
显示全部楼层
 
 
 
原来如此。。 
好象有点头绪了,我在研究看看。。 
 
谢谢 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
 楼主 |
发表于 25-11-2005 01:25 AM
|
显示全部楼层
 
 
 
有些linker的问题。。 
 
我include了process.h ,然后在additional dependancy 也放了LIBCMT.LIB MSVCRT.LIB 
为何compiler还是不认识 _beginthread 这个function.. |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
发表于 25-11-2005 02:44 AM
|
显示全部楼层
 
 
 
原帖由 tensaix2j 于 25-11-2005 01:25 AM 发表 
有些linker的问题。。 
 
我include了process.h ,然后在additional dependancy 也放了LIBCMT.LIB MSVCRT.LIB 
为何compiler还是不认识 _beginthread 这个function..   
 
linker library 的设定呢? 
 
LIBCMT.LIB 是static link 版, msvcrt 是dynamic link 版; 应该是选择其中之一。 
 
你可能需要加入  
#ifndef __MT  
#define __MT   
 
或者在MSVC 的configuration 里 的#define 或other option (我不清楚因为我没有用VC) 
 
如果是dynamic link 的话, __DLL 也要加入 
 
 
注意, 是两个下划线 (underscore) __  , 不是一个。 
 
 
我不会multithreading , 不太清楚正式coding 会是如何, 以上的资料是根据一般程序的compiler/linker problem来猜测。  
 
 
 
 
参考这两个网页 
http://msdn.microsoft.com/librar ... ._beginthreadex.asp 
http://msdn.microsoft.com/librar ... .time_libraries.asp 
 
[ 本帖最后由 jangancari 于 25-11-2005 02:47 AM 编辑 ] |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
发表于 25-11-2005 09:24 AM
|
显示全部楼层
 
 
 
比较ADVANCE的做法是(如果你的CLIENT有一定的数量的话) 
 
SERVER 可以只用一个 LISTENING PORT 和一个 SENDING PORT 
不过 LISTENING 时最好要用 MULTITHREAD 
因为 MULTITHREAD 可以缓慢 LOOPING 的冲击 
当有新的 CONNECTION 进来时 就开新的 THREAD  
然后在 THREAD 里用 CLIENT 的 IP 来 CREATE 新的 CONNECTION 
就这样,SERVER 可以在同时间 LISTEN TO 不同的 CLIENT 
而不是一个CLIENT 罢了 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
 楼主 |
发表于 25-11-2005 05:17 PM
|
显示全部楼层
 
 
 
...原来我忘了把runtime library 换去MT 了。。 
 
原帖由 80cents 于 25-11-2005 09:24 AM 发表 
比较ADVANCE的做法是(如果你的CLIENT有一定的数量的话) 
 
SERVER 可以只用一个 LISTENING PORT 和一个 SENDING PORT 
不过 LISTENING 时最好要用 MULTITHREAD 
因为 MULTITHREAD 可以缓慢 LOOPING 的冲击 
当有新 ...   
 
我简单的都做不好。。 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
 楼主 |
发表于 25-11-2005 08:16 PM
|
显示全部楼层
 
 
 
| 
现在出现很多莫名其妙的unresolvables..... 唉~~。。 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
发表于 28-11-2005 02:25 AM
|
显示全部楼层
 
 
 
原帖由 tensaix2j 于 25-11-2005 08:16 PM 发表 
现在出现很多莫名其妙的unresolvables..... 唉~~。。   
 
unresolvable symbol 是没有link 到一些library , 把那些unresolve symbol 用goolge 找microsoft 的网页, 就可以知道需要哪一个library 了。 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
 楼主 |
发表于 28-11-2005 02:35 AM
|
显示全部楼层
 
 
 
就是以下四个。。 
google过了,得不到解决。。 
 
__RTC_Initbase 
__RTC_shutdown 
@RTC_CheckStackVars@8 
__RTC_CheckEsp |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
发表于 29-11-2005 09:38 AM
|
显示全部楼层
 
 
 
原帖由 tensaix2j 于 28-11-2005 02:35 AM 发表 
就是以下四个。。 
google过了,得不到解决。。 
 
__RTC_Initbase 
__RTC_shutdown 
@RTC_CheckStackVars@8 
__RTC_CheckEsp   
 
我也找了google 好像没有头绪 。。   
 
你的程序一定要用VC/MFC 吗? 可以用wxwidgets 吗? |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 | 
 | 
 
 
发表于 29-11-2005 01:54 PM
|
显示全部楼层
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 
 |   | 
            本周最热论坛帖子
 
 
 
 |