求助,linux socket通信 read write关系

zhuiof 2011-09-27 01:17:55
client
char *p="abc";
puts(p);
write(clientfd,p,strlen(p));//把abc写入clientfd描述符


server
char *buf=NULL;
read(connfd,buf,strlen(buf));//把connfd的内容读到buf里
puts(buf);//从s端输出buf


c和s能够正常连接,就是不能write,read
小弟刚接触socket,很多不是很懂
在这里先谢谢牛哥牛姐了!
...全文
330 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuiof 2011-09-27
  • 打赏
  • 举报
回复
3q[Quote=引用 9 楼 mscf 的回复:]
一般地,buf是一个静态数组,你设置了buf=NULL,不知道执行这个后会有什么效果,如果你不设置套接字属性,缺省是同步套接字,你的写入和读取必须考虑匹配,尤其是读取,你可以尝试一次只读一个字符,估计就能出来了
[/Quote]
zhuiof 2011-09-27
  • 打赏
  • 举报
回复
虽然不是很明白,不过我会好好看看的[Quote=引用 10 楼 mscf 的回复:]
解决这个后你可以好好研究下select模型,不止套接字,大部分i/o都可以使用这套模型实现生产者消费者同步
[/Quote]
薛定谔之死猫 2011-09-27
  • 打赏
  • 举报
回复
解决这个后你可以好好研究下select模型,不止套接字,大部分i/o都可以使用这套模型实现生产者消费者同步
薛定谔之死猫 2011-09-27
  • 打赏
  • 举报
回复
一般地,buf是一个静态数组,你设置了buf=NULL,不知道执行这个后会有什么效果,如果你不设置套接字属性,缺省是同步套接字,你的写入和读取必须考虑匹配,尤其是读取,你可以尝试一次只读一个字符,估计就能出来了
zhuiof 2011-09-27
  • 打赏
  • 举报
回复
客户端那边把数据发送到了文件描述符,然后通过socket在服务器那边不是就可以直接read了吗?我从文件描述符读出到buf里[Quote=引用 6 楼 mscf 的回复:]
别的先不说,你用来读取的buf是个空指针,再次如果是同步套接字,没读取完整或写入完整设定的字节数函数是不会返回的,所以你的进程会被阻塞
[/Quote]
zhuiof 2011-09-27
  • 打赏
  • 举报
回复
客户端那边把数据发送到了文件描述符,然后通过socket在服务器那边不是就可以直接read了吗?我从文件描述符读出到buf里[Quote=引用 6 楼 mscf 的回复:]
别的先不说,你用来读取的buf是个空指针,再次如果是同步套接字,没读取完整或写入完整设定的字节数函数是不会返回的,所以你的进程会被阻塞
[/Quote]
薛定谔之死猫 2011-09-27
  • 打赏
  • 举报
回复
别的先不说,你用来读取的buf是个空指针,再次如果是同步套接字,没读取完整或写入完整设定的字节数函数是不会返回的,所以你的进程会被阻塞
zhuiof 2011-09-27
  • 打赏
  • 举报
回复
[client.c]#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
struct sockaddr_in clientaddr;
int clientfd;
char *buf=NULL;
int h = 0;
buf="slkjfl";
clientfd = socket(AF_INET,SOCK_STREAM,0);

bzero(&clientaddr,sizeof(clientaddr));
clientaddr.sin_family = AF_INET;
clientaddr.sin_port = htons(8002);
inet_pton(AF_INET,"127.0.0.1",&clientaddr.sin_addr);





printf("wait for link...\n");

if(h == (connect(clientfd,(struct sockaddr *)&clientaddr,sizeof(clientaddr))))
{
printf("connect is successful !!\n");

puts(buf);
write(clientfd,buf,strlen(buf));




}

else
printf("connect failed\n");

close(clientfd);

return 2;


}

[/code]
zhuiof 2011-09-27
  • 打赏
  • 举报
回复
[server.c]#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>
#define MAXLINE 80

int main(int argc,char *argv[])
{
char *p=NULL;
struct sockaddr_in servaddr,cliaddr;
socklen_t cliaddr_len;
int listenfd,connfd=2;
int i=0,n,flag=1,num=1;//init

char *buf=NULL;
listenfd =socket(AF_INET,SOCK_STREAM,0);//create
bzero(&servaddr,sizeof(servaddr));//set
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8002);

if(i==( bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))));
{printf("bind is ok!\n");}

listen(listenfd,20);

while(flag)
{
cliaddr_len = sizeof(cliaddr);
printf("ready accept...\n");
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);
if(connfd!=-1)
printf("ok\n");
else {printf("error\n");break;}
sleep(3);
//read form client
read(connfd,buf,strlen(buf));
puts(buf);
printf("\n");


if(connfd != -1)
{ printf("accepted!%d\n",num);num++;}

else
break;

}

close(connfd);
printf("connfd break\n");
return 1;
}
[/code]
[client.c]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
struct sockaddr_in clientaddr;
int clientfd;
char *buf=NULL;
int h = 0;
buf="slkjfl";
clientfd = socket(AF_INET,SOCK_STREAM,0);

bzero(&clientaddr,sizeof(clientaddr));
clientaddr.sin_family = AF_INET;
clientaddr.sin_port = htons(8002);
inet_pton(AF_INET,"127.0.0.1",&clientaddr.sin_addr);





printf("wait for link...\n");

if(h == (connect(clientfd,(struct sockaddr *)&clientaddr,sizeof(clientaddr))))
{
printf("connect is successful !!\n");

puts(buf);
write(clientfd,buf,strlen(buf));




}

else
printf("connect failed\n");

close(clientfd);

return 2;


}


[/code]

[Quote=引用 1 楼 hnwyllmm 的回复:]
能够正常连接 但是不能收发?
服务器端怎么监听,客户端怎么连接,都贴出来啊
[/Quote]
zhuiof 2011-09-27
  • 打赏
  • 举报
回复
不是很懂[Quote=引用 2 楼 mscf 的回复:]
不能读写就把错误号发出来,和套接字的类型也有关系的,一般用fcntl和select控制异步处理,同步的阻塞是正常的
[/Quote]
薛定谔之死猫 2011-09-27
  • 打赏
  • 举报
回复
不能读写就把错误号发出来,和套接字的类型也有关系的,一般用fcntl和select控制异步处理,同步的阻塞是正常的
羽飞 2011-09-27
  • 打赏
  • 举报
回复
能够正常连接 但是不能收发?
服务器端怎么监听,客户端怎么连接,都贴出来啊

69,579

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧