socket通信的问题
好像阻塞了,请高手帮忙看看.
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...