An Socket communication example based on the UDP protocol is implemented in Linux using the C language
- 2020-05-09 18:59:34
- OfStack
udp server-side source code example under linux:
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int main(int argc, char **argv)
{
printf("server ip: %s/n", argv[1]);
printf("server port: %s/n", argv[2]);
printf("/n service starting.../n/n");
int socketFd;
struct sockaddr_in svrAddr;
struct sockaddr_in localAddr;
socketFd = socket (AF_INET, SOCK_DGRAM, 0);
if ( -1 == socketFd )
{
perror( "socket:" );
exit(-1);
}
// Set the address to be reusable
int option = 1;
setsockopt( socketFd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) );
// The client IP
memset(&localAddr, 0, sizeof(localAddr));
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = inet_addr( argv[1]);
localAddr.sin_port = htons (atoi(argv[2]));
int bindResult = bind(socketFd, (struct sockaddr *) &localAddr, sizeof(localAddr));
if ( -1 == bindResult )
{
perror( "bind:" );
close(socketFd);
exit(-1);
}
// The server IP
memset(&svrAddr, 0, sizeof(svrAddr));
svrAddr.sin_family = AF_INET;
svrAddr.sin_addr.s_addr = inet_addr( argv[1]);
svrAddr.sin_port = htons (atoi(argv[2]));
char tempBuff[2048] = {0};
for ( ; ; )
{
// Receive data
struct sockaddr_in fromAddr;
memset((char *)&fromAddr, 0, (int)sizeof(fromAddr));
socklen_t fromLen = sizeof(fromAddr);
ssize_t result = recvfrom( socketFd, tempBuff, sizeof(tempBuff), 0, (struct sockaddr *)&fromAddr, &fromLen);
if ( -1 == result )
{
perror("recvfrom:");
continue;
}
else
{
printf( "recv data %s successed. data len: %d/n", inet_ntoa(fromAddr.sin_addr), result );
printf( "data:/n");
for ( int i = 0; i < result; i++ )
{
printf( "%02x ", tempBuff[i] );
if ( (i+1)%16 == 0 )
{
printf( "/n" );
}
}
printf( "/n" );
}
// To send data
result = sendto( socketFd, tempBuff, result, 0, (struct sockaddr*)&fromAddr, sizeof(fromAddr));
if ( -1 == result )
{
perror("sendto:");
}
else
{
printf("send data success. data len:%d/n", result );
}
sleep( 60 );
}
close(socketFd);
}
linux client source code sample udp:
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
typedef struct _NSS_HEADER
{
unsigned short ProtocolVersion; /* Protocol version information */
unsigned short MsgType; /* Message type */
unsigned short TransactionNo; /* Transfer number */
unsigned short PacketLength; /* Packet length , including Header */
}NSS_HEADER;
int main(int argc, char **argv)
{
printf("client ip: %s/n", argv[1]);
printf("client port: %s/n", argv[2]);
printf("server ip: %s/n", argv[3]);
printf("server port: %s/n", argv[4]);
printf("/n service starting.../n/n");
int socketFd;
struct sockaddr_in svrAddr;
struct sockaddr_in localAddr;
socketFd = socket (AF_INET, SOCK_DGRAM, 0);
if ( -1 == socketFd )
{
perror( "socket:" );
exit(-1);
}
// Set the address to be reusable
int option = 1;
setsockopt( socketFd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) );
// The client IP
memset(&localAddr, 0, sizeof(localAddr));
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = inet_addr( argv[1]);
localAddr.sin_port = htons (atoi(argv[2]));
int bindResult = bind(socketFd, (struct sockaddr *) &localAddr, sizeof(localAddr));
if ( -1 == bindResult )
{
perror( "bind:" );
sleep(10);
close(socketFd);
exit(-1);
}
// The server IP
memset(&svrAddr, 0, sizeof(svrAddr));
svrAddr.sin_family = AF_INET;
svrAddr.sin_addr.s_addr = inet_addr( argv[3]);
svrAddr.sin_port = htons (atoi(argv[4]));
char tempBuff[2048] = {0};
// Per minute 1 Time data
NSS_HEADER hdr;
memset( &hdr, 0, sizeof(NSS_HEADER));
for ( ; ; )
{
// To send data
hdr.TransactionNo++;
ssize_t result = sendto( socketFd, &hdr, sizeof(NSS_HEADER), 0, (struct sockaddr*)&svrAddr, sizeof(svrAddr));
if ( -1 == result )
{
perror("sendto:");
}
else
{
printf("send data success. data len:%d/n", result );
}
// Receive data
struct sockaddr_in fromAddr;
memset((char *)&fromAddr, 0, (int)sizeof(fromAddr));
socklen_t fromLen = sizeof(fromAddr);
result = recvfrom( socketFd, tempBuff, sizeof(tempBuff), 0, (struct sockaddr *)&fromAddr, &fromLen);
if ( -1 == result )
{
perror("recvfrom:");
}
else
{
printf( "recv data %s successed. data len: %d/n", inet_ntoa(fromAddr.sin_addr), result );
printf( "data:/n");
for ( int i = 0; i < result; i++ )
{
printf( "%02x ", tempBuff[i] );
if ( (i+1)%16 == 0 )
{
printf( "/n" );
}
}
printf("/n");
}
sleep( 60 );
}
close(socketFd);
}