#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<pthread.h>
#define PORT 1234
#define BACKLOG 2 //最大连接数
void *start_routine( void *ptr)
{
int fd = *(int *)ptr;
char buf[100];
int numbytes;
int i,c=0;
printf("this is a new thread,you got connected\n");
printf("fd=%d\n",fd);
if ((numbytes=recv(fd,buf,100,0)) == -1){ //读数据
printf("recv() error\n");
exit(1);
}
char str[100];
char buffer[100];
//将收到的字符串反转 toclient
for(c=0;c<numbytes;c++){
buffer[c]=buf[c];
}
printf("receive message:%s\n",buf);
// printf("numbytes=%d\n",numbytes);
for(i=0;i<numbytes;i++){
str[i]=buf[numbytes-1-i];
}
printf("server will send:%s\n",str);
numbytes=send(fd,str,sizeof(str),0); //发数据
//printf("send numbytes=%d\n",numbytes);
close(fd);
}
int main()
{
int listenfd, connectfd;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_size;
sin_size=sizeof(struct sockaddr_in);
pthread_t thread; //定义一个线程号务器端开始建立sockfd描述符
//创建一个socket 调用socket()函数
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("Creating socket failed.");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server,sizeof(server)); //初始化置0
server.sin_family=AF_INET; //Internet
server.sin_port=htons(PORT);
//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
server.sin_addr.s_addr = htonl (INADDR_ANY); // (将本机器上的long数据转化为网络上的long数据)服务器程序能运行在任何ip的主机上 //INADDR_ANY 表示主机可以是任意IP地址,即服务器程序可以绑定到所有的IP上
// 绑定IP地址、端口号等信息到socket上
if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
perror("Bind error.");
exit(1);
}
// 监听客户端的连接请求,并设置允许的最大连接数
if(listen(listenfd,BACKLOG) == -1){ /* calls listen() */
perror("listen() error\n");
exit(1);
}
while(1)
{
// accept 接收客户端上来的连接
if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1) {
perror("accept() error\n");
exit(1);
}
printf("You got a connection from %s\n",inet_ntoa(client.sin_addr) );
//创建线程,调用函数,函数内收发数据
pthread_create(&thread,NULL,start_routine,(void *)&connectfd);
}
close(listenfd);// 关闭网络连接
}