使用UDP套接字編程可以實現基於TCP/IP協議中面向無連接的通信,它分爲服務器端和客戶端2部分,實現流程圖如下:
服務器端的實現流程大概如下:
(1)使用socket()創建套接字
(2)爲創建的套接字綁定上指定的IP,協議類型,和端口等信息
(3)等待接受客戶端的數據請求
(4)處理客戶端的數據請求
(5)向客戶端發送應答數據
(6)關閉套接字
客戶端的實現流程大概如下:
(1)使用socket()函數創建套接字
(2)發送數據給服務器
(3)等待接收服務器的數據應答
(4)關閉套接字
下面直接上代碼:
這是客戶端的:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<netdb.h>
#include<arpa/inet.h>
#define PORT 1234
#define MAXDATASIZE 200
int main()
{
int socketID;
if((socketID = socket(AF_INET,SOCK_DGRAM ,0))==-1){
printf("socket() error\n");
return 0;
}
sockaddr_in server , to;
socklen_t len = sizeof(server);
server.sin_port = PORT;
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
to = server;
while(true){
char msg[100];
scanf("%s",msg);
int h = strlen(msg);
msg[h] = '\0';
printf("%s",msg);
socklen_t sockLen;
sendto(socketID , msg ,h,0,(struct sockaddr*)&to,sizeof(to));
recvfrom(socketID, msg , 100, 0 , (struct sockaddr*)&to,&sockLen);
printf("%s\n", msg);
printf("%d\n",to.sin_addr.s_addr);
if(!strcmp(msg,"Finsh!"))break;
}
close(socketID);
}
這是服務器的:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 1234
#define MaxDataSize 200
int main()
{
int socketID ;
if((socketID = socket(AF_INET, SOCK_DGRAM , 0)) == -1){
printf("socket() error\n");
return 0;
}
printf("socket Create Success : %d\n",socketID );
//
sockaddr_in server;
socklen_t len = sizeof(server);
server.sin_port = PORT;
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
int opt = SO_REUSEADDR;
setsockopt(socketID , SOL_SOCKET , SO_REUSEADDR , &opt, sizeof(opt));
if((bind(socketID , (struct sockaddr *)&server ,sizeof(server)))==-1){
printf("bind() error\n");
return 0;
}
printf("bind() Success\n");
char buf[MaxDataSize];
sockaddr_in from;
len = sizeof(from);
while(1)
{
int num = recvfrom(socketID ,buf , MaxDataSize ,0,(struct sockaddr*)&from , &len);
buf[num] = '\0';
printf("message len : %d\n", num);
printf("%s\n",buf );
char msg[100] = "msg send Success!";
sendto(socketID , msg , 100,0,(struct sockaddr*)&from ,sizeof(from));
if(!strcmp(buf , "Finsh !"))break;
}
close(socketID);
printf("Close socket\n");
return 0;
}
你可以在客戶端發送消息給服務器並在服務器端接受