博客中的那篇通信文章仅仅能够实现一个客户端向一个服务器发送消息,当在局域网内多客户端向往服务器端发送消息,则无法实现。最近用到多个ARM板和PC机组网通信的问题,于是便改进了服务器的代码,加入线程实现这个功能,现在代码贴出来!
/*
************************************************
*Name : Linux Server *
*Date : 2015-03-27 *
*Author : Sniper *
*Aim : Service can receive more than one *
* Client that send the message. *
************************************************
*/
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <sys/socket.h>
#include <pthread.h>
int socketfd_connect = 0;
pthread_t ntid;
int len = 0;
void *print_message(void *arg)
{
char buf[100];
int pthread_socket_connect;
pthread_socket_connect = socketfd_connect;
pthread_detach(ntid);
memset(buf,0,100);
len=recv(pthread_socket_connect,buf,100,0);
if(len<0)
{
printf("recv error!\n");
exit(1);
}
else if(0 == len)
{
printf("the client quit!\n");
exit(1);
}
else
{
printf("receive message is : %s \n",buf);
}
printf("------------------------\n");
pthread_exit(0);
}
int main(int argc,char *argv[])
{
int socketfd_listen;
struct sockaddr_in server_addr,client_addr;
unsigned short portnum = 0x22B8;
int err;
/*
*Create the socket
*/
if((socketfd_listen=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("Socket create error! \n");
exit(1);
}
/*
*set the address format
*/
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr("192.168.81.122");
server_addr.sin_port=htons(portnum);
if(bind(socketfd_listen,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))<0)
{
printf("bind failure!\n");
return -1;
}
printf("bind Success!\n");
if(listen(socketfd_listen,5)<0)
{
printf("Listen failure!\n");
return -1;
}
len=sizeof(struct sockaddr);
/*
*Using the loop to send and receive the message.
*/
while(1)
{
socketfd_connect = accept(socketfd_listen, (struct sockaddr *)(&client_addr), &len);
if(socketfd_connect<0)
{
printf("accept fail !\n");
return -1;
}
err = pthread_create(&ntid,NULL,print_message,NULL);
if(err!=0)
printf("can't create pthread!\n");
}
close(socketfd_listen);
close(socketfd_connect);
return 0;
}
最近用的是Arm-2410 的板子,我把客户端和服务器端的代码放到下面的链接中,供大家使用:
链接中生成的是arm-linux-gcc-3.4.6编译通过的客户端代码,如果想改成PC端的只用修改Makefile中的文件即可。
http://pan.baidu.com/s/1ntsqowL