udp通讯程序多线程

客户端

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include <stdlib.h>

#include <string.h>

#include<stdio.h>

#include <pthread.h>

 

int s,addr_len;

struct sockaddr_in addr;

void *recieve_function(void *arg)    线程函数,创建线程后执行的内容

{

char gbuffer[1024];    接受的大小小于1024

while(1)

{

   bzero(gbuffer,sizeof(gbuffer));   清空buffer

   int glen = recvfrom(s,gbuffer,sizeof(gbuffer),0,(struct sockaddr *)&addr,&addr_len);   从socket得到数据

   printf("server: %s/n",gbuffer);   打印出来

}

}

main(int ac,char** av)

{

if (ac < 3)

{

 fprintf(stdout, "Usage: %s <ip> <port>/n", av[0]);

 exit(1);

}

参数解析

int len;

 

 

addr_len =sizeof(struct sockaddr_in);

char buffer[1024];

if((s = socket(PF_INET,SOCK_DGRAM,0))<0){

perror("socket");

exit(1);

}

 

bzero(&addr,sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_port = htons(atoi(av[2]));

addr.sin_addr.s_addr = inet_addr(av[1]);

根据参数构成一个addr

if(connect(s,(struct sockaddr*)&addr,sizeof(addr))==-1)

{

perror("connect error");

exit(1);

}

连接

pthread_t t1;

 

if( pthread_create( &t1, NULL, recieve_function, NULL) )

               printf("erro creating thread");

建立一个回收的线程

char msg[16] = "client message";

sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&addr,addr_len);

while(1){

memset(buffer,0,sizeof(buffer));

清空buffer

len =read(STDIN_FILENO,buffer,sizeof(buffer));

从标准的输入输出读入buffer

sendto(s,buffer,len,0,(struct sockaddr *)&addr,addr_len);

发送到服务器

}

}

服务器端
服务器端与客户端基本一致
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include<stdio.h>
#include <pthread.h>
int s,addr_len;
struct sockaddr_in addr;
void *recieve_function(void *arg)
{
char gbuffer[1024];
while(1)
{
   bzero(gbuffer,sizeof(gbuffer));
   int glen = recvfrom(s,gbuffer,sizeof(gbuffer),0,(struct sockaddr *)&addr,&addr_len);
   printf("client: %s/n",gbuffer);
}
}
main(int ac,char** av)
{
if (ac < 2)
{
 fprintf(stdout, "Usage: %s <port>/n", av[0]);
 exit(1);
}
int len;
int addr_len =sizeof(struct sockaddr_in);
char buffer[1024];
if((s = socket(PF_INET,SOCK_DGRAM,0))<0){
perror("socket");
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(av[1]));
  addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr的构成不同
if(bind(s,(struct sockaddr*)&addr,sizeof(addr))==-1)
{
perror("bind error");
exit(1);
}
绑定到端口
pthread_t t1;
if( pthread_create( &t1, NULL, recieve_function, NULL) )
               printf("erro creating thread");
while(1){
   
   memset(buffer,0,sizeof(buffer));
   len =read(STDIN_FILENO,buffer,sizeof(buffer));
   sendto(s,buffer,len,0,(struct sockaddr *)&addr,addr_len);
}
}
由于有段时间时间按没有看linux下的程序和网络了,这两段程序想了半天,刚开始一直调试不通,因为没有bind和connect

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值