1、服务端
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sys/time.h>
#include <sys/select.h>
#include <errno.h>
#include <signal.h>
void *client_phtread(void *arg)
{
int nfp , *p, num = 0;
char buffer[100] = {0};
ssize_t len=0;
p = (int *)arg;
nfp = *p;
fd_set readfds,tmpfds;
struct timeval timeval;
int ret=0;
printf("nfp %d client enter\n",nfp);
FD_ZERO(&readfds);
FD_SET(nfp,&readfds);
while(1) {
tmpfds = readfds;
timeval.tv_sec = 5;
timeval.tv_usec = 0;
//sleep(1);
ret = select(nfp+1,&tmpfds,NULL,NULL,&timeval);
if(ret < 0) {
printf("select fail\n");
break;
}else if(ret == 0) {
printf("select %d timeout\n",nfp);
}else{
if(FD_ISSET(nfp,&tmpfds)) {
memset(buffer, 0, 100);
len = recv(nfp, buffer, sizeof(buffer), 0);
if(len == -1) {
printf("%d recv errno %d:%s\n",nfp,errno,strerror(errno));
break;
}else if(len == 0){
printf("%d recv len %ld\n",nfp,len);
break;
}else{
printf("%d recv len %ld date:%s\n",nfp,len,buffer);
}
}
}
}
printf("nfp %d client end\n",nfp);
close(nfp);
pthread_exit(NULL);
}
int sfp;
void mainexit(int sig)
{
printf("sig %d",sig);
close(sfp);
}
int main()
{
int nfp;
struct sockaddr_in s_add,c_add;
int sin_size;
unsigned short portnum=9006;
fd_set readfds,tmpfds;
struct timeval timeval;
int ret=0;
pthread_t client_tid;
printf("Hello,welcome to my server !\r\n");
signal(SIGINT, mainexit);
sfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfp) {
printf("socket fail ! \r\n");
return -1;
}
printf("socket ok !\r\n");
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY);
s_add.sin_port=htons(portnum);
if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) {
printf("bind fail !\r\n");
return -1;
}
printf("bind ok !\r\n");
if(-1 == listen(sfp,5)) {
printf("listen fail !\r\n");
return -1;
}
printf("listen ok\r\n");
sin_size = sizeof(struct sockaddr_in);
FD_ZERO(&readfds);
FD_SET(sfp,&readfds);
while(1) {
tmpfds = readfds;
timeval.tv_sec = 10;
timeval.tv_usec = 0;
ret = select(sfp+1,&tmpfds,NULL,NULL,&timeval);
if( ret < 0) {
printf("%d select errno %d:%s\n",sfp, errno,strerror(errno));
break;
}else if(ret == 0 ) {
printf("select %d timeout\n",sfp);
}else{
if(FD_ISSET(sfp,&tmpfds)) {
nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
if(-1 == nfp) {
printf("%d accept errno %d:%s\n",sfp, errno,strerror(errno));
continue;
}else {
printf("accept ok!\r\nServer start get connect from ip:%s port:%d\r\n", inet_ntoa(c_add.sin_addr), c_add.sin_port);
pthread_create(&client_tid, NULL, client_phtread, &nfp);
}
}
}
}
close(sfp);
return 0;
}
2、客户端
#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{
int cfd;
int recbyte;
int sin_size;
char buffer[512] = {0};
char *str;
struct sockaddr_in s_add, c_add;
unsigned short portnum=0 ;
int len;
printf("Hello,welcome to client!\r\n");
if(argc != 3) {
printf("usage: echo ip\n");
return -1;
}
portnum = atoi(argv[2]);
cfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == cfd) {
printf("socket fail ! \r\n");
return -1;
}
printf("socket ok !\r\n");
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr= inet_addr(argv[1]);
s_add.sin_port=htons(portnum);
printf("server = %s ,port : %d\r\n",argv[1],portnum);
if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) {
printf("connect fail !\r\n");
return -1;
}
printf("connect ok !\r\n");
while(1) {
sleep(1);
memset(buffer, 0, sizeof(buffer));
printf("please enter:");
if(scanf("%s",buffer)) {
len = send(cfd,buffer,strlen(buffer),MSG_NOSIGNAL);
if(len == -1) {
printf("errno %d:%s\n",errno,strerror(errno));
break;
}
}
}
close(cfd);
return 0;
}