socket疑难杂症

1.recv不等待是因为你使用的是非阻塞socket,换而你使用阻塞socket一样需要等待。
recv的recvfrom是可以替换使用的,只是recvfrom多了两个参数,可以用来接收对端的地址信息,这个对于udp这种无连接的,可以很方便地进行回复。
而换过来如果你在udp当中也使用recv,那么就不知道该回复给谁了,如果你不需要回复的话,也是可以使用的。另外就是对于tcp是已经知道对端的,
就没必要每次接收还多收一个地址,没有意义,要取地址信息,在accept当中取得就可以加以记录了。

 

2.在服务器端不能获取正确的发送方的IP地址
Q.服务器端代码:
n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(structaddr*)&addr,&addrlen);
客户端向服务器端发送msg后,服务器端能收到,但是,在服务器端不能获取正确的发送方的IP地址。

A.几经努力,问题终于解决:
n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(structaddr*)&addr,&addrlen);
在调用recvfrom()之前,加上:addrlen = sizeof(struct sockaddr);即可(之前声明 int addrlen; )。

3.标志字符串结束

使用java开发socket通信时,当使用输出流的情况输出时,例如:           
PrintWriter os=new PrintWriter(socket.getOutputStream());
os.println(msg);//一定要用println才能标志字符串结束
os.flush();


最后一句不可省略,否则不会刷新缓存,客户端则不能接收到任何数据。若是不用println,用print则字符串不会结束,这样,接收端则会一直等待,直到字符串结束或连接断开才会说明本次字符串已传输完毕,因此在使用这种方法输出时,一定要注意传送字符串传送完毕的标志位。

此外,我在使用perl进行socket通信时,也出现了此类问题。用perl进行socket通信的编程时,发送的消息最后一定要加上\n,也就是换行符,这样,才被认为是通信结束。

posted on 2009-03-30 14:24  alon  阅读(400)  评论(0编辑  收藏  举报

导航