您的位置:首页 > 其它

套接字socket实现UDP

2017-03-11 22:26 232 查看
      TCP/UDP都是运输层协议,他们之间的最大区别就是TCP是面向连接的可靠传输协议,而UDP是不可靠的。

UDP的主要特点:

1.UDP是无连接的,发送数据不需要建立连接,因此,减少了开销和发送数据之前的时延。
2.UDP使用最大努力交付,不保证可靠交付。
3.UDP是面向报文的,而TCP是面向字节流的。
4.UDP没有拥塞控制。
5.UDP支持一对一,一对多,多对一和多对多的交互通信。
6.UDP的首部开销小,只有8个字节。

UDP的首部格式

(1).源端口:源端口号,在需要对方回信时使用。不需要时可以全部设置为0.
(2).目的端口:目的端口号,在终点交付报文时必须要使用到。
(3).长度:UDP用户数据报的长度,最小值为8.
(4).检验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。(在计算校验和的时候,要在UDP用户数据报之前增加12个字节的伪首部,伪首部不想上递交,也不向下传递。IP数据报的检验和值检验IP数据报的首部,但UDP的检验和把首部和数据部分一起都检验)。
需用函数:
recvfrom



返回值描述



sendto



返回值描述



代码实现:
server.c
/*************************************************************************
> File Name: server.c
> Author: ZX
> Mail: 18829897183@163.com
> Created Time: Fri 10 Mar 2017 09:26:04 PM PST
************************************************************************/

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

int main(int argc, char* argv[])
{
//printf("I am server!\n");
if( argc != 3)
{
printf("Usage: %s [local_ip] [local_port]",argv[0]);
return 1;
}

int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
perror("socket");
return 2;
}
//printf("sock = %d\n",sock);
int opt = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = inet_addr(argv[1]);
local.sin_port = htons(atoi(argv[2]));

//bind
if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0)
{
perror("bind");
return 3;
}

char buf[1024];
int buflen = sizeof(buf);
struct sockaddr_in peer;
socklen_t len = sizeof(peer);

while(1)
{
ssize_t s = recvfrom(sock, buf, buflen, 0, (struct sockaddr*)&peer, &len);

if(s < 0)
{
perror("recvfrom");
return 4;
}
else if(s == 0)
{
printf("client is quit!\n");
}
else
{
printf("client# %s\n",buf);
}
}

close(sock);
return 0;
}
client.c
/*************************************************************************
> File Name: server.c
> Author: ZX
> Mail: 18829897183@163.com
> Created Time: Fri 10 Mar 2017 09:26:04 PM PST
************************************************************************/

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

int main(int argc, char* argv[])
{
//printf("I am client!\n");
if( argc != 3)
{
printf("Usage: %s [server_ip] [server_port]",argv[0]);
return 1;
}

int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
perror("socket");
return 2;
}

char buf[1024];
int buflen = sizeof(buf);
struct sockaddr_in peer;
peer.sin_family = AF_INET;
peer.sin_addr.s_addr = inet_addr(argv[1]);
peer.sin_port = htons(atoi(argv[2]));
socklen_t len = sizeof(peer);

while(1)
{
printf("Please Enter# ");
fflush(stdout);

ssize_t _s = read(0, buf, sizeof(buf)-1);

buf[_s-1] = 0;
ssize_t s = sendto(sock, buf, buflen, 0, (struct sockaddr*)&peer, len);
if(s < 0)
{
perror("sendto");
return 4;
}

//	printf("server# %s\n", buf);
}

close(sock);
return 0;
}


Makefile
.PHONY:all
all:server client

client:client.c
gcc -o $@ $^
server:server.c
gcc -o $@ $^

.PHONY:clean
clean:
rm -f server client


编译环境:Centos
编译语言:C语言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: