目录
TCP客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024
void error_handling(char *message);
int main(int argc, char *argv[])
{
int sockfd;
char message[BUF_SIZE] = {0};
struct sockaddr_in serv_addr, client_addr;
int len = sizeof(serv_addr);
int n = 0;
socklen_t addr_sz;
if(argc!=3)
{
printf("Usage: %s <IP> <port>\n", argv[0]);
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
serv_addr.sin_port=htons(atoi(argv[2]));
if (connect(sockfd,(struct sockaddr *)&serv_addr,len) < 0)
{
perror("Fail to accept");
exit(EXIT_FAILURE);
}
while(1)
{
fputs("Insert message(q/Q to quit): ", stdout);
fgets(message, sizeof(message), stdin);
message[strlen(message)-1] = '\0';
n = send(sockfd,message,strlen(message),0);
if (n < 0)
{
perror("Fail to recv");
exit(EXIT_FAILURE);
}
else if (n == 0)
{
printf("client is not connect\n");
exit(EXIT_FAILURE);
}
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
{
break;
}
}
close(sockfd);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
TCP服务端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024
void error_handling(char *message);
int main(int argc, char *argv[])
{
int listen_sock = 0;
int connect_sock = 0;
char message[BUF_SIZE] = {0};
socklen_t clnt_addr_sz;
struct sockaddr_in serv_addr, clnt_addr;
int n = 0;
n = sizeof(serv_addr);
if(argc!=3)
{
printf("Usage: %s <port>\n", argv[0]);
exit(1);
}
listen_sock=socket(AF_INET, SOCK_STREAM, 0); //创建一个面向消息类型的套接字,注意第二个实参SOCK_DGRAM
if(listen_sock==-1)
error_handling("UDP socket creation error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
serv_addr.sin_port=htons(atoi(argv[2]));
if (bind(listen_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) //将通信地址信息绑定到套接字上,构成UDP套接字
error_handling("bind() error");
listen(listen_sock,5);
printf("Listen...\n");
connect_sock = accept(listen_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_sz);
if (connect_sock < 0)
{
perror("Fail to accept");
exit(EXIT_FAILURE);
}
printf("==================================\n");
printf("connect_sock: %d\n",connect_sock);
printf("client IP: %s\n",inet_ntoa(clnt_addr.sin_addr));
printf("client port: %d\n",ntohs(clnt_addr.sin_port));
while(1)
{
memset(message,0,sizeof(message));
clnt_addr_sz=sizeof(clnt_addr);
n = recv(connect_sock, message, sizeof(message),0);
if (n<0)
{
perror("Fail to recv");
exit(EXIT_FAILURE);
}
else if(n == 0)
{
printf("client is not connect");
exit(EXIT_FAILURE);
}
if (strncmp(message,"quit",4) == 0)
break;
printf("recv %d bytes: %s\n",n,message);
}
close(listen_sock);
close(connect_sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}