- 论坛徽章:
- 0
|
Linux TCP通信问题
请教高手们一个TCP通信问题:
server端:PC windows TCPIP助手
client端:虚拟机 Linux redhat
现象:TCP连接建立成功,client端可以发送数据都server端,但是server端口不能发送数据给client端口。
程序一直阻塞在while循环里面 nbytes = read(sockfd,buffer,1024);奇怪的是server端连续发送1K个数据,程序突然显示出来所有的数据。也就是说server端必须发够1024字节函数read才释放。按道理来说 read函数应该读到几个数据就返回几个数据,不会堵塞在read处。
程序代码本身应该没有什么问题,我是复制的网上的程序代码。
问题是不是出在socket设置那里,socket buffer是不是必须满足1024个字节才触发中断?
多谢指教啊!
图片为server端:PC windows TCPIP助手
程序源代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define portnumber 3333
int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int n,nbytes;
/* 使用hostname查询host 名字 */
if(argc!=2)
{
fprintf(stderr,"Usage:%s hostname \a\n",argv[0]);
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}
/* 客户程序开始建立 sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr)); // 初始化,置0
server_addr.sin_family=AF_INET; // IPV4
server_addr.sin_port=htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号
server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
printf("connect OK!\n");
n=fork();
if(n == 0)//子进程
{
while(1)
{
/* 连接成功了 , 发送数据 */
printf("please input your data:\n");
fgets(buffer,1024,stdin);
write(sockfd,buffer,strlen(buffer));
}
}
else//父进程
{
while(1)
{
//memset(buffer,0,1024);
nbytes = read(sockfd,buffer,1024);
if(nbytes == -1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
else//nbyte>0,read success
{
buffer[nbytes]='\0';
printf("Server received %s",buffer);
}
}
}
close(sockfd);
exit(0);
}
|
|