#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define MAXSTR 100
struct sockaddr_in ServerAddr; //用于存储服务器的地址和初始化其他函数
struct sockaddr_in ClientAddr; //用于存储客户端的地址
socklen_t ClientAddrLen = sizeof(ClientAddr);
int ServerSocket; //服务器端套接字描述字
int ClientSocket; //客户端套接字描述字
uint16_t uPort = 9999; //服务器使用的端口号
char server_name[10]="SERVER";
char client_name[10];
int sendLen;
int recvLen;
char sendBuffer[MAXSTR];
char recvBuffer[MAXSTR];
void *thread(void)
{
while(1)
{
recvLen = recv(ClientSocket,recvBuffer,sizeof(recvBuffer),0);
if(recvLen < 0)
{
printf("recv failed\n");
exit(-1);
}
printf("%s:%s\n",client_name,recvBuffer);
}
}
int main(void)
{
//创建服务器的套接字
ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(ServerSocket < 0)
{
printf("socket failed\n");
exit(-1);
}
ServerAddr.sin_family = AF_INET; //连接方式 TCP/IP IPV4
ServerAddr.sin_port = htons(uPort); //端口号
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); //任何客户端都可以连接
//绑定服务器地址
if(bind(ServerSocket , (struct sockaddr*)&ServerAddr,sizeof(ServerAddr)) < 0)
{
printf("bind failed\n");
exit(-1);
}
//监听有无客户端连接
if(listen(ServerSocket,1) < 0)
{
printf("listen failed\n");
exit(-1);
}
printf("waiting connect....\n");
//阻塞等待客户端连接
ClientSocket = accept(ServerSocket,(struct sockaddr *)&ClientAddr,&ClientAddrLen);
if(ClientSocket < 0)
{
printf("accept failed\n");
exit(-1);
}
//打印连接的客户端地址
printf("Successfully got a connection from IP:%s Port:%d \n\n\n",
inet_ntoa(ClientAddr.sin_addr),htons(ClientAddr.sin_port));
//发送服务器端名字
sendLen = send(ClientSocket,server_name,sizeof(server_name),0);
if(sendLen < 0)
{
printf("send failed\n");
exit(-1);
}
recvLen = recv(ClientSocket,client_name,sizeof(client_name),0);
if(recvLen < 0)
{
printf("recv failed\n");
exit(-1);
}
pthread_t thread_id;
pthread_create(&thread_id,NULL,(void *)*thread,NULL);
while(1)
{
static int a[10];
char buf[10];
//fgets(sendBuffer,MAXSTR,stdin);
sleep(1);
for(int i=0;i<10;i++)
{
sprintf(buf,"%d ",a[i]++);
strcat(sendBuffer,buf);
}
sendLen = send(ClientSocket,sendBuffer,sizeof(sendBuffer),0);
memset(sendBuffer,0,sizeof(sendBuffer)); //发送缓存清零
if(sendLen < 0)
{
printf("send failed\n");
exit(-1);
}
}
close(ServerSocket);
close(ClientSocket);
return 0;
}