非阻塞connect
server
#include <stdio.h>
#include <stdlib.h>
#include "tcpser.h"
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/select.h>
#include <errno.h>
#define LISTSIZE 50
//#define MAX(a,b)((a)>(b)? (a):(b))
#define ADDRBUFFER 50
#define RECV_BUFSIZE 1024
int main()
{
fd_set* r_set,w_set,e_set;
int sd,wd;
int nsd;
ssize_t num;
int flag;
char recv_buffer[RECV_BUFSIZE];
char addr_buffer[ADDRBUFFER];
struct sockaddr_in laddr, raddr;
struct timeval timel;
timel.tv_sec = 60;
int raddr_size = sizeof(raddr);
// fp = fopen();
// int fd = fileno(fp);
sd = socket(AF_INET,SOCK_STREAM,0);
if(sd<0)
{
perror("socket");
exit(1);
}
if(setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&flag,sizeof(flag))<0)
{
perror("setsockopt");
exit(1);
}
laddr.sin_family = AF_INET;
laddr.sin_port = htons(PORT);
inet_pton(AF_INET,"0.0.0.0",(void*)&laddr.sin_addr);
if(bind(sd,(void*)&laddr,sizeof(laddr))<0)
{
perror("bind");
exit(1);
}
if(listen(sd,LISTSIZE)<0)
{
perror("listen");
exit(1);
}
while(1)
{
FD_ZERO(r_set);
//FD_ZERO(w_set);
FD_SET(sd,r_set);
//FD_SET(fd,w_set);
switch(select(sd+1,r_set,NULL,NULL,&timel))
{
case 0:
{
fprintf(stdout,"timeout\n");
break;
}
case -1:
{
if(errno == EINTR)
continue;
else
{
perror("select");
break;
}
}
default:
{
if(FD_ISSET(sd,r_set))
{
nsd = accept(sd,(void*)&raddr,(void*)&raddr_size);
if( nsd < 0)
{
perror("accept");
exit(1);
}
inet_ntop(AF_INET,(void*)&raddr.sin_addr,addr_buffer,ADDRBUFFER);
printf("the client ip is %s, port is %d\n",addr_buffer,ntohs(raddr.sin_port));
while(1)
{
num = recv(nsd,recv_buffer,RECV_BUFSIZE,0);
if(num == 0)
{
printf("end \n");
break;
}
else if(num<0)
{
perror("recv");
exit(1);
}
if(write(nsd,recv_buffer,num)<0)
{
perror("write");
exit(1);
}
}
close(nsd);
}
}
}
}
close(sd);
exit(0);
}
client
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <string.h>
#include <strings.h>
#include "tcpser.h"
#define MAXLINE 1024
int main(int argc, char* argv[])
{
int sockfd;
int n;
struct sockaddr_in servaddr;
char buf[MAXLINE];
fd_set rset;
int maxfd;
int stdineof;
if(argc != 2){
printf("invalid usage!\n");
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("socket");
exit(1);
}
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
perror("socket");
exit(1);
}
maxfd = sockfd;
FD_ZERO(&rset);
stdineof = 0;
while(1){
if(stdineof == 0)
FD_SET(0, &rset);
FD_SET(sockfd, &rset);
if((n = select(maxfd+1, &rset, NULL, NULL, NULL)) < 0){
printf("select error\n");
exit(1);
}
if(FD_ISSET(0, &rset)){
if((n = read(0, buf, MAXLINE)) == 1){
printf("shutdown ready\n");
stdineof = 1;
if(shutdown(sockfd, SHUT_RD) < 0){
perror("shutdown");
exit(1);
}
FD_CLR(0, &rset);
continue;
}
else if(n < 0){
perror("read");
exit(1);
}
if((n = write(sockfd, buf, n)) < 0){
perror("write");
exit(1);
}
}
if(FD_ISSET(sockfd, &rset)){
if((n = read(sockfd, buf, MAXLINE)) == 0){
if(stdineof == 1)
break;
else{
printf("server terminated\n");
exit(1);
}
}
else if(n < 0){
perror("read");
exit(1);
}
if((n = write(1, buf, n)) < 0){
perror("write");
exit(1);
}
}
}
return 0;
}
h文件
#ifndef TCPSER_H_
#define TCPSER_H_
#define PORT 2010
#endif