Linuxではudpモードでの2つのクライアント間の通信をC言語で実現
2894 ワード
必要な知識:Linux Cネットワークプログラミングに関する知識と簡単なマルチスレッド操作
2つのクライアントのコードは同じで、ポート番号を交換すれば、1つのクライアントのうちのネイティブポートMY_PORTは、別のクライアントの宛先ポートDEST_に相当するPORT
参照先:https://blog.csdn.net/manonghouyiming/article/details/79803403
2つのクライアントのコードは同じで、ポート番号を交換すれば、1つのクライアントのうちのネイティブポートMY_PORTは、別のクライアントの宛先ポートDEST_に相当するPORT
#include
#include
#include
#include
#include
#include
#define MY_IP "127.0.0.1"
#define MY_PORT 52100
#define DEST_IP "127.0.0.1"
#define DEST_PORT 52200
typedef struct my_sock_cb
{
int fd;
struct sockaddr_in addr_my;
int addrlen_my;
}my_sock_cb;
typedef struct dest_sock_cb
{
int fd;
struct sockaddr_in addr_dest;
int addrlen_dest;
}dest_sock_cb;
my_sock_cb mysock = {-1};
dest_sock_cb destsock = {-1};
int initsocket()
{
mysock.fd = socket(AF_INET, SOCK_DGRAM, 0);
destsock.fd = socket(AF_INET, SOCK_DGRAM, 0);
if( mysock.fd<0 || destsock.fd<0 )
{
perror("create socket error!
");
exit(1);
}
mysock.addr_my.sin_family = AF_INET;
mysock.addr_my.sin_addr.s_addr = inet_addr(MY_IP);
mysock.addr_my.sin_port = htons(MY_PORT);
mysock.addrlen_my = sizeof(struct sockaddr_in);
destsock.addr_dest.sin_family = AF_INET;
destsock.addr_dest.sin_addr.s_addr = inet_addr(DEST_IP);
destsock.addr_dest.sin_port = htons(DEST_PORT);
destsock.addrlen_dest = sizeof(struct sockaddr_in);
int ret = bind(mysock.fd, (struct sockaddr*)&mysock.addr_my, mysock.addrlen_my);
if(ret == -1)
{
perror("bind.");
exit(1);
}
return 0;
}
void* recv_msg(void* sock)
{
my_sock_cb *mysock = (my_sock_cb*)sock;
struct sockaddr_in addr_other;
char recvbuf[256];
while(1)
{
recvfrom(mysock->fd, recvbuf, 256, 0, (struct sockaddr*)&addr_other, &mysock->addrlen_my);
printf("other:>%s
", recvbuf);
if( !strcmp(recvbuf, "exit") )
break;
}
close(mysock->fd);
}
void* send_msg(void* sock)
{
dest_sock_cb *destsock = (dest_sock_cb*)sock;
char sendbuf[256];
while(1)
{
printf("Input:>");
scanf("%s",sendbuf);
sendto(destsock->fd, sendbuf, strlen(sendbuf)+1, 0,
(struct sockaddr*)&destsock->addr_dest,destsock->addrlen_dest);
if( !strcmp(sendbuf,"exit") )
break;
}
close(destsock->fd);
}
int main()
{
initsocket();
my_sock_cb *sock1 = &mysock;
dest_sock_cb *sock2 = &destsock;
void* recv_msg(void*);
void* send_msg(void*);
pthread_t t1,t2;
pthread_create(&t2, NULL, send_msg, (void *)sock2);
pthread_create(&t1, NULL, recv_msg, (void *)sock1);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}
参照先:https://blog.csdn.net/manonghouyiming/article/details/79803403