查看: 1074|回复: 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
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|