您的位置:首页 > 运维架构 > Linux

linux下C语言UDP通信

2015-09-27 14:24 483 查看
UDP:

无连接不可靠, 但是在稳定的网络中效率高

socket(
AF_INET, SOCK_DGRAM ,0) ;

struct sockaddr_in;

bind( ); // 为了确定目标

sendto (int socket, const void *message, size_t length,

int flags, const struct sockaddr *dest_addr, //发送message给对应地址

socklen_t dest_len);

ssize_t recvfrom(int socket, void *restrict buffer, size_t length,

int flags, struct sockaddr *restrict address, // 保存地址

socklen_t *restrict address_len);

实例:

server端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>

#include<sys/socket.h>
#include<netdb.h>

int port=8888;

int main()
{
int sockfd;
int len;
int ret;
char buf[256];
struct sockaddr_in adr_inet;//server
struct sockaddr_in adr_clnt;//client

/* 建立socket */
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd==-1)
{
perror("create socket error:");
exit(1);
}

/* 建立IP地址 */
adr_inet.sin_family=AF_INET;
adr_inet.sin_port=htons(port);
adr_inet.sin_addr.s_addr =htonl(INADDR_ANY);
//inet_pton(AF_INET, "192.168.1.181", &srvaddr.sin_addr);
bzero(&(adr_inet.sin_zero),8);
len=sizeof(struct sockaddr_in);

printf("server : waiting for client...\n");

/* 绑定socket */
ret=bind(sockfd, (struct sockaddr *)&adr_inet, sizeof(adr_inet));
if(ret==-1)
{
perror("bind error");
exit(1);
}
while(1)
{
/* 接受传来的信息 */
ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&adr_clnt,&len);
printf("new connection: %s:%hu\n",inet_ntoa(adr_clnt.sin_addr), ntohs(adr_clnt.sin_port));
if(ret<0)
{
perror("recvfrom error:");
exit(1);
}
buf[ret]='\0';
printf("server receive:%s",buf);
/* 收到stop字符串,终止连接*/
if(strncmp(buf,"stop",4)==0)
{
printf("recevice stop ,ending....\n");
break;
}
}
close(sockfd);
exit(0);
}
client端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>

#include<netdb.h>
#include<sys/socket.h>

int port=8888;

int main()
{
int sockfd;
int i=0;
int ret;
char buf[80],str1[80];
struct sockaddr_in adr_srvr; //the address of server
//ILE *fp;
/*以只读的方式打开liu文件*/
/*=fopen("test","r");
if(fp==NULL)
{
perror("fopen error:");
exit(1);
}*/

printf("client :  connecting server ...\n");
/* 建立IP地址 */
adr_srvr.sin_family=AF_INET;//TCP/IP family
adr_srvr.sin_port=htons(port);//port
//adr_srvr.sin_addr.s_addr = htonl(INADDR_ANY);//local IP
inet_pton(AF_INET, "192.168.1.11",&adr_srvr.sin_addr.s_addr);
bzero(&(adr_srvr.sin_zero),8);

sockfd=socket(AF_INET,SOCK_DGRAM,0);//UDP
if(sockfd==-1)
{
perror("create socket error:");
exit(1);
}

/* 读取三行数据,传给udpserver*/
for(i=0;i<3;i++)
{
fgets(str1,80,stdin);
printf("client sending:");
printf("%d:%s",i,str1);
sprintf(buf,"%d:%s",i,str1);

ret=sendto(sockfd,buf,sizeof(buf),0,\
(struct sockaddr *)&adr_srvr, sizeof(adr_srvr));
if(ret<0)
{
perror("sendto error:");
exit(1);
}
}
sprintf(buf,"stop\n"); //send "stop" to server
ret=sendto(sockfd,buf,sizeof(buf), 0, \
(struct sockaddr *)&adr_srvr, sizeof(adr_srvr));
if(ret<0)
{
perror("sendto error");
exit(1);
}
//fclose(fp);
close(sockfd);
exit(0);
}

使用:

./server启用服务端

./client启用客户端,然后输入内容,服务端会收到。

ip和端口都在代码里定义了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: