簡単なTcpポイントツーポイントチャットプログラム

15370 ワード

一、テーマ
標準Cでlinuxシステムの下のsocket通信に基づくTCPサーバーとクライアントの一対一の一問一答のチャットプログラムを編纂する.
要件:
1、サーバープログラムを書き出し、tcp_と命名するserver.c.
2、クライアントプログラムを書き出し、tcp_と命名するclient.c.
3、クライアント送信文字列BeginChatでチャットを開始し、送信文字列QuitChatはチャットを終了し、両側のプログラムを終了する.
4、チャットの内容はすべてキーボードで入力します.
二、プログラム
tcp_server.c
#include 
#include
#include
#include <string.h>
#include
#include
#include in.h>
#include

#define server_port 3456
#define BACKLOG 10
#define MAX_SIZE 1024

void SendMsg(int to_sockfd, char *msg); //
char *RecvMsg(int from_sockfd); //

int main()
{
struct sockaddr_in server_addr,client_addr;
int addr_len = sizeof(struct sockaddr_in);

int server_fd, client_fd;

// sockaddr_in
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // = INADDR_ANY
bzero(&(server_addr.sin_zero),8);

// socket
server_fd = socket(AF_INET, SOCK_STREAM,0);
if(server_fd == -1){
perror("socket error");
exit(-1);
}

//
int bind_stats = bind(server_fd,(struct sockaddr *)&server_addr,addr_len);
if(bind_stats == -1){
perror("bind error");
exit(-1);
}

//
if((listen(server_fd, BACKLOG))==-1){
perror("listen error");
exit(-1);
}

//
while(1)
{
//
client_fd = accept(server_fd,(struct sockaddr *)&client_addr,&addr_len);
if(client_fd == -1)
{
perror("accept error");
}
printf("Server get connection from %s
",inet_ntoa(client_addr.sin_addr));

SendMsg(client_fd,"connected");

char chat_msg[MAX_SIZE]; //
char reply_msg[MAX_SIZE]; //
bzero(chat_msg,MAX_SIZE);

/*int byte_num = recv(client_fd,chat_msg,MAX_SIZE,0); //
chat_msg[byte_num] = '\0'; //
*/
strcpy(chat_msg, RecvMsg(client_fd));

if(strcmp(chat_msg,"BeginChat") == 0) // ‘BeginChat’
{
printf("Client begin chat
");
SendMsg(client_fd,"ok, chat begin
");
//
while(1)
{
bzero(chat_msg,MAX_SIZE);
strcpy(chat_msg ,RecvMsg(client_fd)); //

if(strcmp(chat_msg,"QuitChat") == 0)
{
printf("Client LogOff
");
break;
}

printf("client said: %s
",chat_msg); //
printf("me:");
scanf("%s",reply_msg); //
SendMsg(client_fd,reply_msg); //
}
close(client_fd);
}
}

return 0;
}

//
void SendMsg(int to_sockfd, char *msg)
{
int len = strlen(msg);
if(send(to_sockfd,msg,MAX_SIZE,0)==-1){
perror("send error");
}
}

//
char *RecvMsg(int from_sockfd)
{
char msg[MAX_SIZE];
bzero(msg,MAX_SIZE);
int byte_num = recv(from_sockfd,msg,MAX_SIZE,0);
msg[byte_num] = '\0';
return msg;
}

tcp_client.c
#include 
#include
#include
#include <string.h>
#include
#include
#include in.h>
#include

#define dest_port 3456
#define dest_IP "127.0.0.1"
#define MAX_SIZE 1024

void SendMsg(int to_sockfd, char *msg); //
char *RecvMsg(int from_sockfd); //

int main()
{
struct sockaddr_in server_addr;
int addr_len = sizeof(struct sockaddr_in);

int server_fd, client_fd;

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(dest_port);
server_addr.sin_addr.s_addr = inet_addr(dest_IP);
bzero(&(server_addr.sin_zero),8);

server_fd = socket(AF_INET,SOCK_STREAM,0);

if(connect(server_fd,(struct sockaddr *)&server_addr,addr_len) == 0)
{
char chat_msg[MAX_SIZE]; //
bzero(chat_msg,MAX_SIZE);

strcpy(chat_msg , RecvMsg(server_fd));
if(strcmp(chat_msg,"connected") == 0)
{
printf("%s
",chat_msg);
while(1)
{
printf("me:");
scanf("%s",chat_msg); //
SendMsg(server_fd,chat_msg); //
if(strcmp(chat_msg,"QuitChat") == 0)
{
printf("EndChat
");
break;
}
bzero(chat_msg,MAX_SIZE);
strcpy(chat_msg , RecvMsg(server_fd)); //
printf("server reply:%s
",chat_msg);
}
}
close(server_fd);
}

return 0;
}

//
void SendMsg(int to_sockfd, char *msg)
{
int len = strlen(msg);
if(send(to_sockfd,msg,MAX_SIZE,0)==-1){
perror("send error");
}
}

//
char *RecvMsg(int from_sockfd)
{
char msg[MAX_SIZE];
bzero(msg,MAX_SIZE);
int byte_num = recv(from_sockfd,msg,MAX_SIZE,0);
msg[byte_num] = '\0';
return msg;

}

転載先:https://www.cnblogs.com/hbq-fczzw/archive/2011/12/01/2269645.html