C语言实现A和B的相互交流
以下两个文件编译后分别在服务器上同时执行
在服务器上分别监听端口2000和3000,分别用作A和B的信息接收和发送
A:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<net/if.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>
char text[100][100];
int truindex[100] = {0};
int myindex = 0;
int i = 0;
void *client_one()
{
int port = 20000;
int inet_sock;
struct ifreq ifr;
char ip[32] = {NULL};
inet_sock = socket(AF_INET,SOCK_DGRAM,0);
strcpy(ifr.ifr_name,"eth0");
ioctl(inet_sock,SIOCGIFADDR,&ifr);
strcpy(ip , inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
int sockfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in ser,cli;
memset(&ser,0,sizeof(ser));
ser.sin_family = AF_INET;
ser.sin_port = htons(port);
ser.sin_addr.s_addr = inet_addr(ip);
if(connect(sockfd,(struct sockaddr*)&ser,sizeof(ser))<0){
perror("connect server fail");
return -1;
}
while(1)
{
char buf[1024] = {NULL};
//printf("please cin:\n");
scanf("%s",&buf);
if(send(sockfd,buf,strlen(buf),0))
{
printf("send success\n");
}
strcpy(&text[myindex],&buf);
truindex[myindex] = 1;
myindex++;
system("clear");
for(i=0 ; i<myindex; i++)
{
if(truindex[i] == 2)
printf(" %s\n",text[i]);
else
printf("%s\n",text[i]);
}
}
close(sockfd);
}
void* server_two()
{
int port = 30000;
int server_sock = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_sockaddr;
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(port);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
int len = 0;
if(bind(server_sock,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
{
printf("bind");
return 1;
}
if(listen(server_sock, 6) == -1)
{
printf("listen");
return 1;
}
char buffer[8192];
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
int clientfd = -1;
printf("connet wait\n");
clientfd = accept(server_sock, (struct sockaddr*)&client_addr,&length);
printf("connet seccess\n");
while(1)
{
memset(buffer, 0 ,sizeof(buffer));
len = recv(clientfd, buffer,sizeof(buffer),0);
printf(" %s\n",buffer);
strcpy(&text[i],&buffer);
truindex[myindex] = 2;
myindex++;
}
}
int main()
{
int i =0;
pthread_t test_a;
pthread_t test_b;
pthread_create(&test_a,NULL,server_two,NULL);
sleep(10);
pthread_create(&test_b,NULL,client_one,NULL);
sleep(10000);
}
B:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<net/if.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>
char text[100][100];
int truindex[100] = {0};
int myindex = 0;
int i = 0;
void* server_one()
{
int port = 20000;
int server_sock = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_sockaddr;
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(port);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
int len = 0;
if(bind(server_sock,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
{
printf("bind");
return 1;
}
if(listen(server_sock, 6) == -1)
{
printf("listen");
return 1;
}
char buffer[8192];
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
int clientfd = -1;
printf("connet wait\n");
clientfd = accept(server_sock, (struct sockaddr*)&client_addr,&length);
printf("connet seccess\n");
while(1)
{
memset(buffer, 0 ,sizeof(buffer));
len = recv(clientfd, buffer,sizeof(buffer),0);
printf(" %s\n",buffer);
strcpy(&text[myindex],&buffer);
truindex[myindex] = 2;
myindex++;
}
}
void *client_two()
{
int port = 30000;
int inet_sock;
struct ifreq ifr;
char ip[32] = {NULL};
inet_sock = socket(AF_INET,SOCK_DGRAM,0);
strcpy(ifr.ifr_name,"eth0");
ioctl(inet_sock,SIOCGIFADDR,&ifr);
strcpy(ip , inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
int sockfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in ser,cli;
memset(&ser,0,sizeof(ser));
ser.sin_family = AF_INET;
ser.sin_port = htons(port);
ser.sin_addr.s_addr = inet_addr(ip);
if(connect(sockfd,(struct sockaddr*)&ser,sizeof(ser))<0){
perror("connect server fail");
return -1;
}
while(1)
{
char buf[1024] = {NULL};
//printf("please cin:\n");
scanf("%s",&buf);
if(send(sockfd,buf,strlen(buf),0))
{
printf("send success\n");
}
strcpy(&text[myindex],&buf);
truindex[myindex] = 1;
myindex++;
system("clear");
for(i=0 ; i<myindex; i++)
{
if(truindex[i] == 2)
printf(" %s\n",text[i]);
else
printf("%s\n",text[i]);
}
}
close(sockfd);
}
int main()
{
pthread_t test_a;
pthread_t test_b;
pthread_create(&test_a,NULL,server_one,NULL);
sleep(10);
pthread_create(&test_b,NULL,client_two,NULL);
sleep(10000);
}
执行效果: