免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3062 | 回复: 7
打印 上一主题 下一主题

[WebServer] Linux TCP通信问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-07 23:16 |只看该作者 |倒序浏览
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);
}



socket问题1.JPG (41 KB, 下载次数: 79)

h

h

论坛徽章:
0
2 [报告]
发表于 2014-07-13 10:09 |只看该作者
有木有同学遇到过类似的问题啊。

论坛徽章:
0
3 [报告]
发表于 2014-07-13 17:31 |只看该作者
为什么你客户端用fork创建进程?不是都是在服务端建立进程的么?要不你试试看,而且不要用那个什么助手,自己重新编程序,当初我把服务端程序交叉编译到pcduino上,客户端在虚拟机上,然后通讯也是这样,服务器端一直在等待,阻塞了

论坛徽章:
0
4 [报告]
发表于 2014-07-17 12:00 |只看该作者
多谢大侠指点啊。:wink:

论坛徽章:
0
5 [报告]
发表于 2014-09-08 12:27 |只看该作者
设置为非柱塞试试

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
6 [报告]
发表于 2014-10-05 11:54 |只看该作者
write(sockfd,buffer,strlen(buffer));这里换成sizeof看

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-09-15 06:20:00
7 [报告]
发表于 2014-12-05 23:14 |只看该作者
不知道你的问题有没有解决。
1.不建议用什么调试工具。
2.在使用buf之前进行bzero,你注释掉了。
3.server_addr.sin_addr.s_addr=inet_addr(argv[1]);//将字符串 ip 转换为数值型。

你可以把服务器端程序 都贴上来,一起看。目测是没看出来哪的问题。

论坛徽章:
0
8 [报告]
发表于 2014-12-08 16:33 |只看该作者
试了,不存在lz说的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP