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

高手请教socket 发送信息被合并

    来源: 互联网  发布时间:2016-09-02

    本文导语:  我使用客户端向服务器发送信息时,多条发送信息被服务器端合并成一条信息接收,这个如何解决? 客户端代码: #include  #include  #include  #include  int main(int argc, char **argv) { int fd; struct sockaddr_in address; int add...

我使用客户端向服务器发送信息时,多条发送信息被服务器端合并成一条信息接收,这个如何解决?
客户端代码:
#include 
#include 
#include 
#include 

int main(int argc, char **argv)
{
int fd;
struct sockaddr_in address;
int address_len;
int rtval;
char data[100];
char data2[100];
char ip[30];
int port = 8001;
int len;
struct timeval tvafter,tvpre;
struct timezone tz;
////////////////
memset(ip,0,sizeof(ip));
strcpy(ip,"192.168.1.4");
//printf(・s・asctime(gmtime(&timep)));
//建立套接口
fd = socket(AF_INET, SOCK_STREAM, 0);
//联接
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ip);
address.sin_port = htons(port);
address_len = sizeof(address);
rtval = connect(fd, (struct sockaddr *)&address, address_len);
if(rtval == -1) 
{
printf("sent ddddddddd:%sn", data);
exit(1);
}
//发送数据
memset(data,0,sizeof(data));
gettimeofday (&tvpre , &tz);
snprintf(data,sizeof(data),"Client to Server--%d:%d---------n",tvpre.tv_sec,tvpre.tv_usec);
while(1)
{
send(fd, (void *)data, strlen(data), 0);
printf("sent line:Data-%sn",data);
}
//接收数据
printf("client exit.n");
//关闭
close(fd);
}

服务器代码:
#include 
#include 
#include 
#include 
#include 
int main(int argc, char **argv)
{
int fd;
int address_len;
struct sockaddr_in address;
struct timeval tvafter,tvpre;
struct timezone tz;
//建立套接口
fd = socket(AF_INET, SOCK_STREAM, 0);
//绑定地址和端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_ANY);
address.sin_port = htons(8001);
address_len = sizeof(address);
bind(fd, (struct sockaddr *)&address, address_len);
//建立套接口队列
listen(fd, 50);
while(1) {
struct sockaddr_in client_address;
int len;
int client_sockfd;
char data[100];
char data2[100];
printf("waiting...");
fflush(stdout);
//等待
len = sizeof(client_address);
client_sockfd = accept(fd, (struct sockaddr *)&client_address, &len);
//接收数据
while(1)
{
recv(client_sockfd, (void *)data, 400,0);
printf("server receivce line:%sn", data);
usleep(1000);
}
//关闭联接
close(client_sockfd);
usleep(10);
}
}

|
LINUX下操作套接字,就像操作普通文件一样。发送端不管发送多少次,数据都是到达了一个地址上,也就是说写到了同一个套接字。打个比方,你在编辑一个文件时,你是数据发送端,文件是数据接收端。你不停地写数据,但最后都是存到了同一个文件中。这样,当读取数据的时候,当前已经写了多少数据,就会读多少。

如果LZ想要分别读取每次发送的数据,可以使用这个办法:
发送数据的时候,连同数据的字节数一起发送过去;在读取的时候,先读取数据总字节数(要用二进制表示)bytes,然后紧接着读取bytes个字节的数据。

|
如果是有规则的数据,可以采用结构体的方式接收数据。

如果是无规则但连续的数据,可以通过构造分隔符或者指定数据格式的方式来读取。

|
TCP是流的观念,数据是一连续的数据,你需要按格式来解吸,你可以自己定义分隔符或许一个数据长度,这样来把它分成一段一段数据在使用.

|
严重支持楼上的说法,理解"字节流"很重要
发送和接收数据要定好协议,即发送端以何种方式组包,同样接收端以何种方式拆包

|
3楼和4楼说得很有道理。

至于细节的东西,综合LS两位的说法:
如果数据比较少的话,可以采用解析的方法;但如果数据量很大的话,可以采用我说的那种方法。

我现在也是在一点点地实践,欢迎大家指正哈!

    
 
 

您可能感兴趣的文章:

  • 简单问题,如何把包合并?望高手指教
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 请教高手:如何用gnome/gtk编写托盘程序
  • 请教各位高手一个简单的问题:在JAVA 中如何才能取得一些系统信息?
  • 请教curses的高手
  • #######菜鸟问题,请教高手,一定给分########
  • 如何在Linux上使用LoadLibrary()?高手请教!
  • 请教:Java高手读书之路
  • 请教高手:cpu占用经常100%怎么解决?
  • linux起不来了,请教高手,谢谢
  • 关于courier邮件服务器的配置问题,请教高手
  • 我的REDHAT 9。0刚装好,显卡不能正常显示,请教各位高手
  • 请教高手,如何将磁盘阵列mount上去??
  • 请教高手,关于vmware中linux的鼠标的问题
  • 请教高手在QT下怎样收串口数据
  • 请教高手,如何在VMware下安装suse10.0??请指教,谢谢。
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • 请教solaris高手一个solaris安装问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请高手指点一下,怎样用javamail发送含有图片、声音等的html文件
  • linux下C语言向串口发送0的问题?请高手指教
  • 内核发送信号给进程的问题,高手来拿分了
  • Linux下写串口操作,对每次发送的数据要分多次写,不能一次写完,敬请高手赐教
  • 500分发送,望各位高手赐教,尽可能给出SHELL编码
  • 向高手请教(至少200分)一个局域网内发送以太帧的问题
  • 在socket中如何利用HTTP协议进行发送和接受数据?——新手问题,请高手赐教!
  • 有劳高手帮我看看我的这个发送邮件程序???希望高手抽点时间给看看!!!
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • 我是新手,高手,高手,快来救我
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈
  • 高手请进,中文乱码问题,这是我同一个问题的第五个帖子了,大伙帮忙,心情好郁闷.期待高手.
  • [纳闷贴]为什么那么多人非说要成为高手就不要用X,难道Linux就是为了成为高手用的?
  • 寻找UNIX高手——IBM UNIX高手招募


  • 站内导航:


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

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3