server
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define UDP_TEST_PORT 50001
int main(int argC, char* arg[])
{
struct sockaddr_in addr;
int sockfd, len = 0;
int addr_len = sizeof(struct sockaddr_in);
char buffer[256];
/* 建立socket,注意必須是SOCK_DGRAM */
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror ("socket");
exit(1);
}
/* 填寫sockaddr_in 結構 */
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(UDP_TEST_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY) ;// 接收任意IP發來的數據
/* 綁定socket */
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))<0) {
perror("connect");
exit(1);
}
while(1) {
bzero(buffer, sizeof(buffer));
len = recvfrom(sockfd, buffer, sizeof(buffer), 0,
(struct sockaddr *)&addr ,&addr_len);
/* 顯示client端的網絡地址和收到的字符串消息 */
printf("Received a string from client %s, string is: %s\n",
inet_ntoa(addr.sin_addr), buffer);
/* 將收到的字符串消息返回給client端 */
sendto(sockfd,buffer, len, 0, (struct sockaddr *)&addr, addr_len);
}
return 0;
}
// ----------------------------------------------------------------------------
// End of udp_server.c
client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define UDP_TEST_PORT 50001
#define UDP_SERVER_IP "127.0.0.1"
int main(int argC, char* arg[])
{
struct sockaddr_in addr;
int sockfd, len = 0;
int addr_len = sizeof(struct sockaddr_in);
char buffer[256];
/* 建立socket,注意必須是SOCK_DGRAM */
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}
/* 填寫sockaddr_in*/
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(UDP_TEST_PORT);
addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);
while(1) {
bzero(buffer, sizeof(buffer));
printf("Please enter a string to send to server: \n");
/* 從標準輸入設備取得字符串*/
len = read(STDIN_FILENO, buffer, sizeof(buffer));
/* 將字符串傳送給server端*/
sendto(sockfd, buffer, len, 0, (struct sockaddr *)&addr, addr_len);
/* 接收server端返回的字符串*/
len = recvfrom(sockfd, buffer, sizeof(buffer), 0,
(struct sockaddr *)&addr, &addr_len);
printf("Receive from server: %s\n", buffer);
}
return 0;
}
// ----------------------------------------------------------------------------
// End of udp_client.c
client2.c
connect函數用於無連接的網絡服務。傳送的報文目的地址會設置成connect調用中所指的地址,這樣每次傳送報文時就不需要再提供地址。另外只能接收來自指定地址的報文。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define UDP_TEST_PORT 50001
#define UDP_SERVER_IP "127.0.0.1"
int main(int argC, char* arg[])
{
struct sockaddr_in addr;
int sockfd, len = 0;
int addr_len = sizeof(struct sockaddr_in);
char buffer[256];
char buffer2[256];
int result=0;
/* 建立socket,注意必須是SOCK_DGRAM */
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}
/* 填寫sockaddr_in*/
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(UDP_TEST_PORT);
addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);
/* Now connect our socket to the server's socket. */
result = connect(sockfd, (struct sockaddr *)&addr, addr_len);
if(result == -1) {
perror("oops: client3");
exit(1);
}
while(1) {
bzero(buffer, sizeof(buffer));
printf("Please enter a string to send to server: \n");
/* 從標準輸入設備取得字符串*/
len = read(STDIN_FILENO, buffer, sizeof(buffer));
write(sockfd, buffer, len);
len = read(sockfd, buffer2, sizeof(buffer2));
printf("Receive from server: %s\n", buffer2);
}
return 0;
}
// ----------------------------------------------------------------------------
// End of udp_client.c
具有超時返回的client
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#define UDP_TEST_PORT 50001
#define UDP_SERVER_IP "127.0.0.1"
#define TIMEOUT 10
void
sigalrm(int signo)
{
}
int main(int argC, char* arg[])
{
struct sockaddr_in addr;
int sockfd, len = 0;
int addr_len = sizeof(struct sockaddr_in);
char buffer[256];
struct sigaction sa;
sa.sa_handler = sigalrm;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGALRM, &sa, NULL) < 0)
printf("sigaction error");
/* 建立socket,注意必須是SOCK_DGRAM */
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}
/* 填寫sockaddr_in*/
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(UDP_TEST_PORT);
addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);
while(1)
{
bzero(buffer, sizeof(buffer));
printf("Please enter a string to send to server: \n");
/* 從標準輸入設備取得字符串*/
len = read(STDIN_FILENO, buffer, sizeof(buffer));
/* 將字符串傳送給server端*/
sendto(sockfd, buffer, len, 0, (struct sockaddr *)&addr, addr_len);
alarm(TIMEOUT);
/* 接收server端返回的字符串*/
if ((len = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL)) < 0)
{
if (errno != EINTR)
alarm(0);
printf("recv error");
exit(0);
}
alarm(0);
printf("Receive from server: %s\n", buffer);
}
return 0;
}
// ----------------------------------------------------------------------------
// End of udp_client.c