当前位置:  技术问答>linux和unix

一个关于数据报socket的问题

    来源: 互联网  发布时间:2017-04-23

    本文导语:  今天写了一个Linux下的基于数据报socket的简单客户/服务器程序,程序很简单,就是服务器把客户程序发送过来的字符由大写变成小写。但是在运行时,无论运行多少个客户端,总会有一个客户端接收不到服务器发给它...

今天写了一个Linux下的基于数据报socket的简单客户/服务器程序,程序很简单,就是服务器把客户程序发送过来的字符由大写变成小写。但是在运行时,无论运行多少个客户端,总会有一个客户端接收不到服务器发给它的信息。希望大家指教一下。
服务器程序文件为sockserver2.c,代码如下:
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main()
{
int server_sockfd = -1;
int server_len = 0;
int client_len = 0;
char buffer[512];
int result = 0;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;

server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(9739);
server_len = sizeof(server_addr);

bind(server_sockfd, (struct sockaddr*)&server_addr, server_len);

signal(SIGCHLD, SIG_IGN);

while(1)
{
result = recvfrom(server_sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &client_len);
if(fork() == 0)
{
buffer[0] += 'a' - 'A';
sleep(5);
sendto(server_sockfd, buffer, sizeof(buffer),0 , (struct sockaddr*)&client_addr, client_len);
printf("%cn", buffer[0]);
}
}
close(server_sockfd);
}


客户程序文件为sockclient.c,代码如下:
#include 
#include 
#include 
#include 
#include 
#include 

int main(int agrc, char *argv[])
{
struct sockaddr_in server_addr;
int server_len = 0;
int sockfd = -1;
int result = 0;
char c = 'A';

if(agrc > 1)
c = argv[1][0];

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(9739);
server_len = sizeof(server_addr);

sendto(sockfd, &c, sizeof(char), 0, 
(struct sockaddr*)&server_addr, server_len);
recvfrom(sockfd, &c, sizeof(char), 0, 0, 0);
printf("char from server = %cn", c);
close(sockfd);
exit(0); 
}


第一次运行结果如下:
一个关于数据报socket的问题[图片]
可以看到有一个客户程序没有结束(客户端./sockclient2.exe E),但是服务确实已经发送数据了,因为服务器在发送数据后,会输出发送的数据。下面再来看看第二次运行的结果,如下:
一个关于数据报socket的问题[图片]
可以看到这次的运行是成功的,三个客户程序都正常运行。经过实验,后面的客户都可以正常运行了。只是在第一次启动服务器程序时运行客户程序会出现这种现象,而且总是只有一个客户程序运行不正常。

希望各们大虾帮忙解答一下。谢谢!

|
子进程没有退出
if(fork() == 0)
        {
            buffer[0] += 'a' - 'A';
            sleep(5);
            sendto(server_sockfd, buffer, sizeof(buffer),0 , (struct sockaddr*)&client_addr, client_len);
            printf("%cn", buffer[0]);
            exit(0);  //子进程退出
        }

    
 
 

您可能感兴趣的文章:

  • php实现socket实现客户端和服务端数据通信源代码
  • socket 编程时,write的写入的数据大于socket缓冲区,会有什么结果??
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • 创建了2个套接字Raw socket和socket,都调用recvfrom(),一个专门捕获数据包,一个在9001端口监听UDP请求,怎么不行?
  • 从多个socket接收数据
  • 在unix下编写socket,从远端接收数据并存入db2数据库
  • 你是否可以回答Socket的问题?数据先后问题
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • UDP SOCKET编程,不能发送广播数据包
  • vc通过socket发送数据给java的问题
  • socket编程中的带外数据问题
  • 请问如何用socket编程向网页POST数据啊?
  • 通过socket连接一次性发送大数据量的问题
  • 客户机和服务器可以双向收发数据的socket编程
  • socket发送数据问题(50分)
  • socket 接收数据问题
  • 高手啊,请问如何将BufferedImage转换为可以用SOCKET传输的数据
  • 发送大量数据,socket API最优分包长度为多少?
  • linux下的socket接收数据的难题!
  • [求助]请问socket编程中send()函数可以发送整形数据吗?
  • 数据太长问题:数据大小超出此类型的最大值 iis7站长之家
  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • 数据太长问题:数据大小超出此类型的最大值
  • jsp取数据库中数据的中文问题
  • 读取sybase数据库中数据出现乱码的问题如何解决?
  • ftp数据包监听及数据包组成问题
  • 从Access数据库读大块数据问题,为什么5119字节左右是极限,怎么解决??
  • JAVA连数据库并插入数据的问题?
  • 谁能帮我解决从数据库中取数据和下拉框连动结合的问题,分数双倍奉上!
  • 请高手指点,从一个数据流读数据到页面上的问题。急!!谢谢
  • 每次运行时,将针对该用户的数据放在临时表如-temTableA中,用完之后删除数据,安全上有问题吗?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.print类docflavor的类成员方法:服务格式化打印数据定义及介绍
  • 如何监控数据库的数据,如果数据库数据更改,就通知Server
  • <<大话数据结构>>中冒泡排序算法改进
  • 如何从数据库中或文本文件中提取数据到另一个数据库中?
  • java命名空间javax.print类docflavor的类成员方法:客户端格式化打印数据定义及介绍
  • 用JDBC连接Oracle数据库时,如何向数据库中写日期型数据(格式)?谢了!
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • linux下用libpcap库函数抓包,如何判断捕获的数据包是IP数据包还是非IP数据包,顺便说一下、捕获的数据包除了IP数据包之外,还有那些种类,非常感谢!!!
  • c#多线程更新窗口(winform)GUI的数据
  • 建立一个ftp数据连接并传送或接受完毕一些数据后,能否不关闭此数据连接,下次接着用?
  • 基于Hadoop的数据挖掘框架
  • 我从JSP页将数据插入到oracle数据库中,为何汉字插入后数据库中显示为乱码呢?
  • Linux c++库boost unordered_set数据插入及查找代码举例
  • 串口应用程序,当对方发送大量的数据时,本方的数据无法发出。对方停止发送,本方的数据仍然无法发出。不知道是什么原因。
  • 文档数据库mongodb与列式数据库hbase详细比较
  • 公司要给客户做报表,从数据库返回数据,他们死活要返回的格式为Excel格式,请问我怎样才能把数据库返回的数据存为Excel的格式?
  • SQL Server 2008如何进行数据库分离和附加详细介绍
  • 数据在页面写不进数据库,也不可以从数据库中读出是什么原因?
  • nosql数据库levedb介绍及levedb最新版1.18下载安装
  • mysql 本地数据库如何从远程数据库导数据
  • Linux c++库boost unordered_map数据插入及查找代码举例
  • 散分:Jbuilder6开发数据库应用请问你们都用什么数据库? 免费的数据库有那些?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,