Linux網絡編程 UDP套接字編程

使用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;

}
你可以在客戶端發送消息給服務器並在服務器端接受
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章