服务器端 监听连接的socket 描述符 用 select 监听 没反应
服务端 监听连接 的 socket 描述符 在 有客户端 connect 的时候, 应该能变为可读, 应该可以用 select 监听到,但实际上没反应,直接上代码:
服务端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
#define PORT 6666
int listenfd, connfd;
int getconnect(void)
{
if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
}
return 0;
}
void *socketConnect(void *arg)
{
fd_set rd;
FD_ZERO(&rd);
int maxfd = connfd;
FD_SET(connfd, &rd);
while(1){
select(maxfd+1,&rd,NULL,NULL,NULL);
if(FD_ISSET(connfd, &rd)){
printf("connection comes\n");
getconnect();
}
}
}
int main(int argc, char** argv)
{
struct sockaddr_in servaddr;
char buff[4096];
int n;
if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
if( listen(listenfd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
printf("======waiting for client's request======\n");
pthread_t socketConnectId;
pthread_create(&socketConnectId, NULL, socketConnect, NULL);
while(1);
}
客户端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
#define SERIP "192.168.1.105"
#define PORT 6666
int main(int argc, char** argv)
{
int sockfd, n;
char recvline[4096], sendline[4096];
struct sockaddr_in servaddr;
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = inet_addr(SERIP);
if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
printf("send msg to server: \n");
fgets(sendline, 4096, stdin);
if( send(sockfd, sendline, strlen(sendline), 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
close(sockfd);
exit(0);
}
运行后,现象:
客户端 connect 能成功返回, 但是 实际上 发送数据 服务端是收不到的。 而服务端 的 select 应该根本没有 检测到 有连接。
有熟悉 select socket 的大侠吗, 帮忙分析一下 代码的问题在哪里。