TCP,UDP发送数据

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <stdint.h>

#define MAXLINE 80
#define TRUE 1
#define FALSE 0
#define TCP_ENABLE 1
#define UDP_ENABLE 0
/*
./a.out -i [ip] -p [port] -s [message] -r -[t|u]
*/

int main(int argc, char *argv[])
{
struct sockaddr_in sendsock;
struct sockaddr_in recvsock;
int sockfd = 0;
socklen_t socklen = 0;
char buf[MAXLINE];
char ipstr[INET_ADDRSTRLEN];
int ret, i;

char *sendmsg = NULL;
uint16_t dstport = 0;
char *dstip = NULL;

uint8_t recv_enable = FALSE;
uint8_t tcp_or_udp = UDP_ENABLE;

for (i = 0; i < argc; i++)
{
if (strcmp(argv[i], "-i") == 0)
dstip = argv[i+1];
else if (strcmp(argv[i], "-p") == 0)
dstport = atoi(argv[i+1]);
else if (strcmp(argv[i], "-s") == 0)
sendmsg = argv[i+1];
else if (strcmp(argv[i], "-r") == 0)
recv_enable = TRUE;
else if (strcmp(argv[i], "-t") == 0)
tcp_or_udp = TCP_ENABLE;
else if (strcmp(argv[i], "-h") == 0)
{
fprintf(stderr, "./a.out -i [ip] -p [port] -s [message] -r -[t|u]\n");
exit(0);
}
else
continue;
}

if (dstip == NULL || dstport == 0)
exit(EXIT_FAILURE);

socklen = sizeof(struct sockaddr);
memset(&sendsock, 0, sizeof(sendsock) );

if (tcp_or_udp == TCP_ENABLE)
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);
ret = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&ret, sizeof(int));
ret = bind(sockfd, (struct sockaddr *)&sendsock, sizeof(sendsock) );
if (ret == -1)
perror("tcp bind err");

sendsock.sin_family = AF_INET;
inet_pton(AF_INET, dstip, &sendsock.sin_addr);
sendsock.sin_port = htons(dstport);
ret = connect(sockfd, (struct sockaddr *)&sendsock, sizeof(sendsock) );
if (ret == -1)
perror("tcp connect err");

ret = send(sockfd, sendmsg, strlen(sendmsg) + 1, 0);
if (ret == -1)
perror("tcp send err");
else
fprintf(stderr, "Client Send \"%s\" To %s:%u\n", sendmsg,
inet_ntop(AF_INET, &sendsock.sin_addr, ipstr, sizeof(ipstr) ),
ntohs(sendsock.sin_port) );

if (recv_enable == TRUE)
{
ret = recv(sockfd, buf, MAXLINE, 0);
if (-1 == ret)
{
perror("recv err");
close(sockfd);
exit(1);
}
buf[ret] = 0;

printf("Client Recv \"%s\" From %s:%u\n", buf,
inet_ntop(AF_INET, &recvsock.sin_addr, ipstr, sizeof(ipstr) ),
ntohs(recvsock.sin_port) );
}

close(sockfd);
exit(0);
}
else
{
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd)
{
perror("create socket error");
exit(1);
}

sendsock.sin_family = AF_INET;
inet_pton(AF_INET, dstip, &sendsock.sin_addr);
sendsock.sin_port = htons(dstport);

// send data to server
ret = sendto(sockfd, sendmsg, strlen(sendmsg) + 1, 0,
(struct sockaddr *)&sendsock, sizeof(sendsock) );
if (-1 == ret)
{
close(sockfd);
perror("call sendto error");
exit(1);
}
else
{
fprintf(stderr, "Client Send \"%s\" To %s:%u\n", sendmsg,
inet_ntop(AF_INET, &sendsock.sin_addr, ipstr, sizeof(ipstr) ),
ntohs(sendsock.sin_port) );
}

// recieve data from server
if (recv_enable == TRUE)
{
ret = recvfrom(sockfd, buf, MAXLINE, 0, (struct sockaddr *)&recvsock,
&socklen);
if (-1 == ret)
{
perror("call recvfrom error");
close(sockfd);
exit(1);
}
buf[ret] = 0;

printf("Client Recv \"%s\" From %s:%u\n", buf,
inet_ntop(AF_INET, &recvsock.sin_addr, ipstr, sizeof(ipstr) ),
ntohs(recvsock.sin_port) );
}

close(sockfd);
exit(0);
}

return 0;
}

原文地址:https://www.cnblogs.com/tiantao/p/2398580.html