關(guān)于socket的配置:
1、創(chuàng)建sokcet套接字
2、為創(chuàng)建的socket綁定地址與端口,指定傳輸?shù)膮f(xié)議,一般采用AF_INET,數(shù)據(jù)的傳輸格式一般為(SOCK_STREAM、SOCK_DGRAM)
3、打開文件標(biāo)識符,并開始發(fā)送數(shù)據(jù)
udp客戶端CODE:
[cpp] view plain copy《pre name=“code” class=“html”》#include 《unistd.h》
#include 《sys/types.h》
#include 《netinet/in.h》
#include 《arpa/inet.h》
#include 《stdlib.h》
#include 《stdio.h》
#include 《errno.h》
#include 《string.h》
void client(int sock){
//2、設(shè)置客戶端socket參數(shù)
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
//3、設(shè)置傳輸協(xié)議、端口以及目的地址
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);
//4、創(chuàng)建發(fā)送與接收緩存字節(jié)數(shù)組
int ret;
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
//5、開始發(fā)送數(shù)據(jù)(此處是發(fā)送來自標(biāo)準(zhǔn)輸入的數(shù)據(jù))
while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){
sendto(sock, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
//6、開始接收數(shù)據(jù),接收服務(wù)端返回的數(shù)據(jù)
ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL);
if(ret == -1){
perror(“recvfrom”);
exit(EXIT_FAILURE);
}
//fputs(recvbuf, stdout); //將服務(wù)端返回的數(shù)據(jù)寫入到標(biāo)準(zhǔn)輸出
//7、清空發(fā)送與接收緩存
memset(sendbuf, 0, sizeof(sendbuf));
memset(recvbuf, 0, sizeof(recvbuf));
}
//8、關(guān)閉socket流
close(sock);
}
int main(void){
int sock;
//1.創(chuàng)建客戶端的socket
if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){
perror(“socket”);
exit(EXIT_FAILURE);
}
client(sock);
return 0;
}
UDP服務(wù)端CODE:
[cpp] view plain copy#include 《stdio.h》
#include 《stdlib.h》
#include 《unistd.h》
#include 《errno.h》
#include 《sys/types.h》
#include 《sys/socket.h》
#include 《netinet/in.h》
#include 《string.h》
void server(int sock){
//1、建立接收緩存字節(jié)數(shù)組
char recvbuf[1024] = {0};
//2、定義socket
struct sockaddr_in peeraddr;
socklen_t peerlen;
int n;
while(1){
//
peerlen = sizeof(peeraddr);
//3、清空接收緩存數(shù)組
memset(recvbuf, 0, sizeof(recvbuf));
//4、開始接收數(shù)據(jù)
n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&peeraddr, &peerlen);
//5、判斷是否接收完整數(shù)據(jù)
if(n == -1){
perror(“recvfrom”);
exit(EXIT_FAILURE);
}else if(n 》 0){
//6、成功接收數(shù)據(jù),將緩存數(shù)據(jù)寫入到標(biāo)準(zhǔn)輸出,打印到控制臺
fputs(recvbuf, stdout);
//7、想客戶端回送接收到的數(shù)據(jù)(回顯客戶端輸入的數(shù)據(jù))
sendto(sock, recvbuf, n, 0, (struct sockaddr *)&peeraddr, peerlen);
}
}
//關(guān)閉socket
close(sock);
}
int main(void){
int sock;
//創(chuàng)建服務(wù)器socket
if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){
perror(“socket error”);
exit(EXIT_FAILURE);
}
//設(shè)置服務(wù)器socket參數(shù)
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
//設(shè)置socket的協(xié)議、端口以及地址
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//將socket綁定地址
if(bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) 《 0){
perror(“bind error”);
exit(EXIT_FAILURE);
}
server(sock);
return 0;
}
評論
查看更多