码了2个小时多,终于弄完了。用的编辑器是Qt creator ,突然发现在Qt creator上,也支持这些底层的c语言。在linux上调试无误。写这个,也算是自己读书的记录吧!
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#define PORT 1234
#define BACKLONG 100
#define MAXCHARSIZE 100
void process_client (int connectfd,struct sockaddr_in client);
void *start_routine(void *arg);
struct ARG{
int connfd;
struct sockaddr_in client;
};
struct ARG *arg;
int main(void)
{
int listenfd,connectfd;
int sin_size;
int opt = SO_REUSEADDR;
struct sockaddr_in server,client;
pthread_t tid;
sin_size = sizeof(struct sockaddr_in);
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("Create socket failed");
exit(-1);
}
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr= htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1)
{
perror("bind error");
exit(-1);
}
if(listen(listenfd,BACKLONG) == -1)
{
perror("listen error");
exit(-1);
}
while(1)
{
if((connectfd = accept(listenfd,(struct sockaddr*)&client,&sin_size)) == -1)
{
perror("Accept error");
exit(-1);
}
arg = (struct ARG *)malloc(sizeof (struct ARG));
arg->connfd = connectfd;
memcpy((void *)&arg->client,&client,sizeof(client));
if(pthread_create(&tid,NULL,start_routine,(void *)arg))
{
perror("pthread_create error\n");
exit(-1);
}
}
close(listenfd);
}
void *start_routine(void *arg)
{
struct ARG *info;
info = (struct ARG *)arg;
process_client(info->connfd,info->client);
free(arg);
pthread_exit(NULL);
}
void process_client(int connectfd, struct sockaddr_in client)
{
char recvbuf[MAXCHARSIZE];
char sendbuf[MAXCHARSIZE];
char client_name[MAXCHARSIZE];
int recvlen,i;
printf("you get a connetion from %s.",inet_ntoa(client.sin_addr));
send(connectfd,"welcome to my server.\n",22,0);
recvlen = recv(connectfd,client_name,MAXCHARSIZE,0);
if(recvlen == 0)
{
close(connectfd);
printf("client disconnetted \n");
return;
}
else if(recvlen < 0)
{
close(connectfd);
printf("connect broked.\n");
return;
}
client_name[recvlen] = '\0';
printf("client name is %s.\n",client_name);
bzero(recvbuf,100);
while(recvlen=recv(connectfd,recvbuf,MAXCHARSIZE,0))
{
recvbuf[recvlen] = '\0';
printf("Receive clent (%s) message:%s\n",client_name,recvbuf);
for(i = 0;i<recvbuf;i++);
sendbuf[i] = recvbuf[recvlen - i -1];
sendbuf[recvlen]= '\0';
send(connectfd,sendbuf,strlen(sendbuf),0);
bzero(recvbuf,100);
}
printf("Client(%s) disconnected\n",client_name);
close(connectfd);
}