socket通信的问题

yphui18 2011-06-28 05:41:48
好像阻塞了,请高手帮忙看看.
socket服务端的代码
/* server.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
int main(void){
struct sockaddr_in servaddr;//服务端地址
struct sockaddr_in cliaddr;//客户端地址
socklen_t cliaddr_len; //客户端长度
int listenfd;//监听端口的文件描述符
int connfd;//
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
int i, n;
listenfd = socket(AF_INET, SOCK_STREAM, 0); //创建socket文件描述
bzero(&servaddr, sizeof(servaddr)); //
servaddr.sin_family = AF_INET; //TCP IP
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //监听的地址
servaddr.sin_port = htons(SERV_PORT);//监听的端口
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));//把文件描述符与端口进行绑定
listen(listenfd, 20); //开始监听
printf("Accepting connections111 ...\n");
while (1)
{
printf("one step...\n");
cliaddr_len = sizeof(cliaddr);
printf("two step...\n");
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len); //这里第二次accept好像阻塞了
printf("three step...\n");
n = read(connfd, buf, MAXLINE);
printf("received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));
for (i = 0; i < n; i++) buf[i] = toupper(buf[i]);
write(connfd, buf, n);

}
close(connfd);
}

客户端的代码

/* client.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
int main(int argc, char *argv[]){
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd, n; char *str;
if (argc != 2) {
fputs("usage: ./client message\n", stderr); exit(1);
}
str = argv[1];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while(1)
{
memset(buf, 0, 20);
printf("buf is %d \n",buf);
printf("begin write\n");
write(sockfd, str, strlen(str));
printf("one step\n");
n = read(sockfd, buf, MAXLINE); //这里第二次read也阻塞了
printf("two step\n");
printf("Response from server:\n");
write(STDOUT_FILENO, buf, n);
printf("\n end write\n");
}
printf("begin close\n");
close(sockfd);
return 0;
}


运行socket客户端程序
./client aa
buf is 804396960
begin write
one step
two step
Response from server:
AA
end write
buf is 804396960
begin write
one step

运行socket服务端程序

./serv
Accepting connections111 ...
Accepting connections222 ...
one step...
two step...
three step...
received from 127.0.0.1 at PORT 58845
one step...
two step...



...全文
166 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwm86 2011-07-02
[Quote=引用 11 楼 u_buntu 的回复:]

可以使用IO多路复用啊,select或则poll
这两个都不错啊!
建议用下!

---------------------------

更多技术文章敬请关注:武汉华嵌-嵌入式培训专家,国内领先的嵌入式服务机构,

http://www.embedhq.org
[/Quote]

回复
u_buntu 2011-07-01
可以使用IO多路复用啊,select或则poll
这两个都不错啊!
建议用下!

---------------------------

更多技术文章敬请关注:武汉华嵌-嵌入式培训专家,国内领先的嵌入式服务机构,

http://www.embedhq.org
回复
5t4rk 2011-07-01
[Quote=引用 3 楼 bdmh 的回复:]

设置非阻塞模式了吗
[/Quote]
+++
回复
crazy_yangyf 2011-07-01
flag = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flag|O_NONBLOCK)
回复
robinkeng 2011-07-01
mark
回复
elated 2011-06-29
win下用5楼的代码
回复
elated 2011-06-29
accept默认下是阻塞模式的。
要想设置为非阻塞模式用下面代码

flag = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flag|O_NONBLOCK);
回复
gaomingok 2011-06-29
//设置非阻塞模式
DWORD nonblock = 1;
ioctlsocket(newSkt,FIONBIO,&nonblock);
回复
yphui18 2011-06-29
怎么设置
回复
bdmh 2011-06-29
设置非阻塞模式了吗
回复
yphui18 2011-06-29
顶起............
回复
就想叫yoko 2011-06-28
Accepting connections222 ... 你程序里面没有打印这个吧
你客户端程序只开了一个 , 服务端第二次当然accept就阻塞了
服务端只给客户端发了一次, 客户端第二次当然read就阻塞了。
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告