socket编程-TCP/UDP实例
在Linux环境下编写TCP通信和UDP通信。
socket编程-TCP通信
TCP Client
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main( int argc, char* argv[] )
{
if( argc <= 3 )
{
printf( "usage: %s ip_address port_number send_data\n", basename( argv[0] ) );
return 1;
}
const char* ip = argv[1];
int port = atoi( argv[2] );
const char* send_data =argv[3];
struct sockaddr_in server_address;
bzero( &server_address, sizeof( server_address ) );
server_address.sin_family = AF_INET;
inet_pton( AF_INET, ip, &server_address.sin_addr );
server_address.sin_port = htons( port );
int sockfd = socket( PF_INET, SOCK_STREAM, 0 ); //创建socket
assert( sockfd >= 0 );
if ( connect( sockfd, ( struct sockaddr* )&server_address, sizeof( server_address ) ) < 0 ) //发起连接
{
printf( "connection failed\n" );
}
else
{
printf( "conenct to server %s:%d succeed.\n", ip , port);
printf( "send data [%s] out\n", send_data );
send( sockfd, send_data, strlen( send_data ), 0 ); //发送数据
}
close( sockfd );
return 0;
}
TCP Server
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[])
{
if (argc <= 2)
{
printf("usage: %s ip_address port_number\n", basename(argv[0]));
return 1;
}
const char *ip = argv[1];
int port = atoi(argv[2]);
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET, ip, &address.sin_addr);
address.sin_port = htons(port);
int sock = socket(PF_INET, SOCK_STREAM, 0); //创建socket
assert(sock >= 0);
int ret = bind(sock, (struct sockaddr *)&address, sizeof(address)); //命名socket
assert(ret != -1);
ret = listen(sock, 5); //监听socket
assert(ret != -1);
struct sockaddr_in client;
socklen_t client_addrlength = sizeof(client);
while (1)
{
int connfd = accept(sock, (struct sockaddr *)&client, &client_addrlength); //接受连接
if (connfd < 0)
{
printf("errno is: %d\n", errno);
}
else
{
char buffer[BUF_SIZE];
memset(buffer, '\0', BUF_SIZE);
ret = recv(connfd, buffer, BUF_SIZE - 1, 0); //读取数据
printf("got %d bytes from %s:%d\n" , ret , inet_ntoa(client.sin_addr) , ntohs(client.sin_port));
printf("data [%s]\n", buffer );
close(connfd);
}
}
close(sock);
return 0;
}
运行结果
tcp_client:

tcp_server:

socket编程-UDP通信
UDP Client
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main( int argc, char* argv[] )
{
if( argc <= 3 )
{
printf( "usage: %s ip_address port_number send_data\n", basename( argv[0] ) );
return 1;
}
const char* ip = argv[1];
int port = atoi( argv[2] );
const char* send_data =argv[3];
struct sockaddr_in server_address;
bzero( &server_address, sizeof( server_address ) );
server_address.sin_family = AF_INET;
inet_pton( AF_INET, ip, &server_address.sin_addr );
server_address.sin_port = htons( port );
int sockfd = socket( PF_INET, SOCK_DGRAM, 0 ); //创建socket
assert( sockfd >= 0 );
int ret = sendto( sockfd, send_data , strlen(send_data) , 0 , (struct sockaddr *)&server_address, sizeof(server_address));//发送数据
if(ret>0){
printf("send %d bytes to server %s:%d.\n" , ret , ip , port);
printf("data [%s]\n", send_data );
}else{
printf("send data failed.\n");
}
close( sockfd );
return 0;
}
UDP Server
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[])
{
if (argc <= 2)
{
printf("usage: %s ip_address port_number\n", basename(argv[0]));
return 1;
}
const char *ip = argv[1];
int port = atoi(argv[2]);
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET, ip, &address.sin_addr);
address.sin_port = htons(port);
int sock = socket(PF_INET, SOCK_DGRAM, 0); //创建socket
assert(sock >= 0);
int ret = bind(sock, (struct sockaddr *)&address, sizeof(address)); //命名socket
assert(ret != -1);
struct sockaddr_in client;
socklen_t client_addrlength = sizeof(client);
char buffer[BUF_SIZE];
while (1)
{
memset(buffer, '\0', BUF_SIZE);
ret = recvfrom(sock, buffer, BUF_SIZE - 1, 0 , (struct sockaddr *)&client , &client_addrlength); //读取数据
printf("got %d bytes from %s:%d\n" , ret , inet_ntoa(client.sin_addr) , ntohs(client.sin_port));
printf("data [%s]\n", buffer );
}
close(sock);
return 0;
}
运行结果
udp_client:

udp_server:


浙公网安备 33010602011771号