主题 : Linux TCP通信问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 105870
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2014-07-07
最后登录: 2015-02-09
楼主  发表于: 2014-07-07 23:24

 Linux TCP通信问题

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);
}



级别: 新手上路
UID: 105870
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2014-07-07
最后登录: 2015-02-09
1楼  发表于: 2014-07-13 10:03
有木有高手遇到过这类问题啊。
级别: 新手上路
UID: 105870
精华: 0
发帖: 22
金钱: 110 两
威望: 22 点
综合积分: 44 分
注册时间: 2014-07-07
最后登录: 2015-02-09
2楼  发表于: 2014-07-17 12:02
焦急等待中。。。。。。。