linux下TCP/IP实现简单聊天程序

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。

服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。


服务器端:


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

#define MAXBUF 1024

int main(int argc, char *argv[])
{
    int pid;	
    int sockfd, new_fd;
    socklen_t len;
    struct sockaddr_in my_addr, their_addr;
    unsigned int myport, lisnum;
    char buf[MAXBUF + 1];

    if (argv[2])
		myport = atoi(argv[2]);
    else
		myport = 7575;

    if (argv[3])
		lisnum = atoi(argv[3]);
	else
		lisnum = 5;

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
    {
		perror("socket");
		exit(EXIT_FAILURE);
    }
    
    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(myport);
    if (argv[1])
		my_addr.sin_addr.s_addr = inet_addr(argv[1]);
    else
		my_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))== -1) 
    {
		perror("bind");
		exit(EXIT_FAILURE);
    }

    if (listen(sockfd,lisnum ) == -1) 
    {
		perror("listen");
		exit(EXIT_FAILURE);
    }
    printf("wait for connect\n");	
    len = sizeof(struct sockaddr);
    if ((new_fd =accept(sockfd, (struct sockaddr *) &their_addr,&len)) == -1) 
    {
        perror("accept");
        exit(EXIT_FAILURE);
    } 
    else
        printf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port), new_fd);
 	  
	if(-1==(pid=fork()))	
	{
		perror("fork");exit(EXIT_FAILURE);
	}
	else if( pid == 0)
	{
		while (1) 
		{
			bzero(buf, MAXBUF + 1);
			printf("input the message to send:");
			fgets(buf, MAXBUF, stdin);
			if (!strncasecmp(buf, "quit", 4)) 
			{
				printf("i will close the connect!\n");
				break;
			}
			len = send(new_fd, buf, strlen(buf) - 1, 0);
	  		if (len < 0)
			 {
				printf("message'%s' send failure!errno code is %d,errno message is '%s'\n",
				buf, errno, strerror(errno));
				break;
			}
		}
	}
	else 
	{	
		while(1)
		{
			bzero(buf, MAXBUF + 1);
			len = recv(new_fd, buf, MAXBUF, 0);
			if (len > 0)
				printf("message recv successful :'%s',%dByte recv\n",buf, len);
			else if (len < 0)
			{
				printf("recv failure!errno code is %d,errno message is '%s'\n",
				errno, strerror(errno));
				break;
			}
			else
			{
				printf("the other one close quit\n");
				break;
			}
		}
	}
	close(new_fd);
	close(sockfd);
    	return 0;
}



客户端:


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

#define MAXBUF 1024

int main(int argc, char **argv)
{
    int sockfd, len;
    struct sockaddr_in dest;
    char buffer[MAXBUF + 1];
    if (argc != 3) 
    {
		printf(" error format,it must be:\n\t\t%s IP port\n",argv[0]);
		exit(EXIT_FAILURE);
    }

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		perror("Socket");
		exit(errno);
    }
    printf("socket created\n");


    bzero(&dest, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_port = htons(atoi(argv[2]));
    if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) 
    {
		perror(argv[1]);	exit(errno);
    }
    if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest))==-1) 
    {
		perror("Connect ");
		exit(errno);
    }
    printf("server connected\n");

	pid_t pid;
	if(-1==(pid=fork()))
	{
		perror("fork");exit(EXIT_FAILURE);
	}
	else if (pid==0)
	{
		while (1) 
		{
			bzero(buffer, MAXBUF + 1);
			len = recv(sockfd, buffer, MAXBUF, 0);
			if (len > 0)
				printf("recv successful:'%s',%d byte recv\n",buffer, len);
			else if(len < 0)
			{
				perror("recv");
				break;
			}
			else
			{
				printf("the other one close ,quit\n");
				break;
			}
		}	
	}
	else
	{
		while (1) 
		{
			bzero(buffer, MAXBUF + 1);
			printf("pls send message to send:");
			fgets(buffer, MAXBUF, stdin);
			if (!strncasecmp(buffer, "quit", 4)) 
			{
				printf(" i will quit!\n");
				break;
			}
			len = send(sockfd, buffer, strlen(buffer) - 1, 0);
			if (len < 0) 
			{
				perror("send");
				break;
			}
		}
	}
    close(sockfd);
    return 0;
}



服务器端执行 :           ./s 192.168.142.132 7575 5


客户端执行:               ./c 192.168.142.132 7575


其中,192.168.142.132是本机的IP地址.


服务器端信息:

root@jieniyimiao-virtual-machine:/home/jieniyimiao/c_code/linux/ch13/sock_tcp_p_p_chat# ./s 192.168.142.132 7575 5
wait for connect
server: got connection from 192.168.142.132, port 44698, socket 4
input the message to send:jieniyimiap
input the message to send:ddddddddddddddddddddddddddd
input the message to send:dddddddddddddddddddddddddddd
input the message to send:aaaaaaaaaaaaaaaaaaaaaa
input the message to send:aaaaaaaaaaaaaaaaaaaaaaaa
input the message to send:message recv successful :‘dddddddddddddddddd‘,18Byte recv
message recv successful :‘ddddddddddddddddd‘,17Byte recv
message recv successful :‘ddddddddddddddddd‘,17Byte recv
message recv successful :‘dddddddddddddd‘,14Byte recv
message recv successful :‘ddddddddddddddd‘,15Byte recv
message recv successful :‘ddddddddddddddddd‘,17Byte recv
message recv successful :‘dddddddddddddd‘,14Byte recv
quit
i will close the connect!


客户端略:



用NETSTAT查看信息如下:

# netstat |grep 192.168.142.132

**********************************************************************************
tcp        0      0 192.168.142.132:7575    192.168.142.132:44698   ****

tcp        0      0 192.168.142.132:44698   192.168.142.132:7575    ****










郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。