linux-网络编程-实验-基于C语言
要求:使用多进程的方法编写程序实现基于TCP的聊天通讯软件和基于UDP的聊天通讯软件。
TCP 实现
tcp server 代码:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h>
void *recv_message(void* plt){
char buf[128] = {0};
while(1)
{
bzero(buf,sizeof(buf));
recv(*(int *)plt ,buf,sizeof(buf) - 1,0);
if (strcmp(buf, "") == 0){
continue;
}
printf("recv: %s",buf);
}
}
int main( int argc, char **argv )
{
pthread_t thread1;
int sid = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = bind(sid,(struct sockaddr *)&addr,sizeof(struct sockaddr));
printf("bind res = %d\n",res);
listen(sid,10);
char buf[128] = {0};
int len,cid;
printf("input q to exit \n");
while(1)
{
cid = accept(sid,NULL,NULL);
pthread_create(&thread1, NULL, &recv_message, &cid);
bzero(buf,sizeof(buf));
while(strcmp(buf,"q\n") != 0)
{
bzero(buf,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
send(cid,buf,strlen(buf),0);
}
close(cid);
}
close(sid);
return 0;
}
tcp client代码:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h>
void *recv_message(void* plt){
char buf[128] = {0};
while(1)
{
bzero(buf,sizeof(buf));
recv(*(int *)plt ,buf,sizeof(buf) - 1,0);
if (strcmp(buf, "") == 0){
continue;
}
printf("recv: %s",buf);
}
}
int main(int argc,char **argv)
{
pthread_t thread1;
int cid = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in saddr = {0};
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8080);
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = connect(cid,(struct sockaddr *)&saddr,sizeof(struct sockaddr));
printf("connect res = %d\n",res);
pthread_create(&thread1, NULL, &recv_message, &cid);
char buf[128] = {0};
int len;
while(strcmp(buf,"q\n") != 0)
{
bzero(buf,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
send(cid,buf,strlen(buf),0);
}
close(cid);
return 0;
}
实验结果
UDP 实现
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
struct Pack{
int cid;
struct sockaddr_in addr;
} pack;
void *recv_message(void* plt){
struct Pack p = *(struct Pack*) plt;
int size = sizeof(struct sockaddr);
char buf[128] = {0};
while(1)
{
memset(buf,0,sizeof(buf)/sizeof(char));
recvfrom(p.cid,buf,sizeof(buf) - 1,0,(struct sockaddr *)&(p.addr),&size);
printf("recv: %s \n", buf);
if (strcmp(buf, "") == 0){
continue;
}
}
}
int main(int argc,char **argv)
{
if(argc < 3)
{
perror("param must >= 3");
return -1;
}
pthread_t thread1;
int cid = socket(AF_INET,SOCK_DGRAM,0);
pack.cid = cid;
if(cid < 0)
{
perror("socket error");
return -1;
}
struct sockaddr_in addr = {0},sendaddr = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[1]));
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
sendaddr.sin_family = AF_INET;
sendaddr.sin_port = htons(atoi(argv[2]));
sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
pack.addr = sendaddr;
pthread_create(&thread1, NULL, &recv_message, &pack);
int res = bind(cid,(struct sockaddr *)&sendaddr,sizeof(struct sockaddr));
char sender[80];
char buf[128] = {0};
int size = sizeof(struct sockaddr);
printf("start cheat\n");
while (1){
memset(sender,0,sizeof(sender)/sizeof(char));
scanf("%s", &sender);
if (strcmp(sender, "q") == 0){
break;
}
sendto(cid,sender,strlen(sender),0,(struct sockaddr *)&addr,size);
}
close(cid);
return 0;
}