码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2015-05-16 13:28:57      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:linux   tcp   聊天   

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

服务器端的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    ****










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

标签:linux   tcp   聊天   

原文地址:http://blog.csdn.net/u013467442/article/details/45767347

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!