Select 客户端
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/time.h>
#define ERR_MSG(msg) \
do \
{ \
fprintf(stderr, "line:%d: %s %s\n", __LINE__, __FILE__, __func__); \
perror(msg); \
} while (0)
#define IP "192.168.2.58"
#define PORT 6666
typedef struct
{
int newfd;
struct sockaddr_in cin;
} Data_Typ;
int TCPClinet_Create()
{
int cfd = socket(AF_INET, SOCK_STREAM, 0);
if (cfd < 0)
{
ERR_MSG("socket");
return -1;
}
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
ERR_MSG("connect");
return -1;
}
printf("connect success \n");
return cfd;
}
int main()
{
Data_Typ cin_dat;
socklen_t addrlen = sizeof(cin_dat.cin);
char buf[128] = "";
int cfd = TCPClinet_Create();
printf("%d",cfd);
fd_set readfds, tempfds;
FD_ZERO(&readfds);
FD_ZERO(&tempfds);
FD_SET(0, &readfds);
FD_SET(cfd, &readfds);
int Select_Flag = 0;
bzero(buf, sizeof(buf));
while (1)
{
tempfds = readfds;
Select_Flag = select(cfd + 1, &tempfds, NULL, NULL, NULL);
if (Select_Flag < 0)
{
ERR_MSG("select");
return -1;
}
if (FD_ISSET(0, &tempfds))
{
scanf("%s",buf);
while (getchar() != '\n');
if (!strcmp(buf, "quit"))
{
FD_ZERO(&readfds);
printf("退出成功!");
break;
}
if (send(cfd, buf, sizeof(buf), 0) < 0)
{
ERR_MSG("send");
return -1;
}
printf("send success!");
}
else if (FD_ISSET(cfd, &tempfds))
{
fprintf(stderr, "触发服务器交互事件>>> \n");
bzero(buf, sizeof(buf));
int res = recv(cfd, buf, sizeof(buf), 0);
if (res < 0)
{
ERR_MSG("recv");
return -1;
}
printf("[%s:%d] newfd = %d : %s\n",
inet_ntoa(cin_dat.cin.sin_addr), ntohs(cin_dat.cin.sin_port), cfd, buf);
}
}
return 0;
}