關于socket的配置:
1、創建sokcet套接字
2、為創建的socket綁定地址與端口,指定傳輸的協議,一般采用AF_INET,數據的傳輸格式一般為(SOCK_STREAM、SOCK_DGRAM)
3、打開文件標識符,并開始發送數據
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、設置客戶端socket參數
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
//3、設置傳輸協議、端口以及目的地址
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);
//4、創建發送與接收緩存字節數組
int ret;
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
//5、開始發送數據(此處是發送來自標準輸入的數據)
while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){
sendto(sock, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
//6、開始接收數據,接收服務端返回的數據
ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL);
if(ret == -1){
perror(“recvfrom”);
exit(EXIT_FAILURE);
}
//fputs(recvbuf, stdout); //將服務端返回的數據寫入到標準輸出
//7、清空發送與接收緩存
memset(sendbuf, 0, sizeof(sendbuf));
memset(recvbuf, 0, sizeof(recvbuf));
}
//8、關閉socket流
close(sock);
}
int main(void){
int sock;
//1.創建客戶端的socket
if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){
perror(“socket”);
exit(EXIT_FAILURE);
}
client(sock);
return 0;
}
UDP服務端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、建立接收緩存字節數組
char recvbuf[1024] = {0};
//2、定義socket
struct sockaddr_in peeraddr;
socklen_t peerlen;
int n;
while(1){
//
peerlen = sizeof(peeraddr);
//3、清空接收緩存數組
memset(recvbuf, 0, sizeof(recvbuf));
//4、開始接收數據
n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&peeraddr, &peerlen);
//5、判斷是否接收完整數據
if(n == -1){
perror(“recvfrom”);
exit(EXIT_FAILURE);
}else if(n 》 0){
//6、成功接收數據,將緩存數據寫入到標準輸出,打印到控制臺
fputs(recvbuf, stdout);
//7、想客戶端回送接收到的數據(回顯客戶端輸入的數據)
sendto(sock, recvbuf, n, 0, (struct sockaddr *)&peeraddr, peerlen);
}
}
//關閉socket
close(sock);
}
int main(void){
int sock;
//創建服務器socket
if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){
perror(“socket error”);
exit(EXIT_FAILURE);
}
//設置服務器socket參數
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
//設置socket的協議、端口以及地址
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;
}
評論