简单的socket聊天程序

服务器:

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

#define PORT        18888    /*端口*/
#define BUFLEN      1024     /*缓存区大小*/
#define LISTENNUM   20       /*socket最大监听数*/
int main(int argc,char** argv)
{
    int sockfd,newfd;    /*本地socket句柄 和 客户端socket句柄*/
    int sin_size;
    struct sockaddr_in s_addr,c_addr;    /*c/s 地址信息结构体,下面有具体的属性赋值*/
    char buffer[BUFLEN]="";    /*缓存区*/

    /*创建socket*/
    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
        perror("socket");
        return -1;
    }

    printf("[CrissLeung] socket create success!\n");
    memset(&s_addr,0,sizeof(s_addr));
    
    /*定义s_addr 的sockaddr_in结构体数据*/
    s_addr.sin_family = AF_INET;    /*该属性表示接收本机或其他机器传输*/
    s_addr.sin_port = htons(PORT);   /*端口号*/
    s_addr.sin_addr.s_addr = htons(INADDR_ANY);   /*IP,括号内容表示本机IP*/

    printf("[CrissLeung] socket start bind!\n");
    //绑定地址结构体和socket,成功返回0,出错返回-1
    if(bind(sockfd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr))<0)
    {
        printf("bind error");
        return -1;
    }

    //开启监听 ,第二个参数是最大监听数,成功返回0,出错返回-1
    printf("[CrissLeung] socket bind success!\n");    
    listen(sockfd, LISTENNUM);
    printf("[CrissLeung] socket listen success!\n");


    while(1)
    {
        sin_size=sizeof(struct sockaddr_in);/*信息结构体size*/
        //在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小,成功返回非负socket,出错返回-1
        if((newfd=accept(sockfd,(struct sockaddr*)&c_addr,&sin_size))== -1)
        {
            printf("[CrissLeung] receive failed\n");
        }
        else
        {
            printf("[CrissLeung] new client connect success\n");
            while(1)
            {
                memset(buffer,0,sizeof(buffer));
                //接收内容,参数分别是连接句柄,缓存区,缓存区大小,其他信息(设为0即可)
                int len = recv(newfd, buffer, sizeof(buffer),0);
                printf("[CrissLeung]: [%s]\n",buffer);

                if(strcmp(buffer,"exit\n")==0)
                {
                    break;
                }
//                fputs(buffer, stdout);
                memset(buffer,0,sizeof(buffer));
                printf("[remote]:");
                gets(buffer);
                printf("\n");
                /*发送内容,参数分别是连接句柄,内容,大小,其他信息(设为0即可)*/
                send(newfd, buffer, strlen(buffer), 0);
            }
        }
    }
}

客户端:

结构注释参考上述服务端

#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>

#define DEST_PORT    18888
#define DEST_IP      "47.95.231.165"
#define MAX_DATA     1024

int main(){
    int sockfd;
    struct sockaddr_in dest_addr;
    char rBuf[MAX_DATA];
    char sBuf[MAX_DATA];

    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        printf("socket failed:%d\n",errno);
    }

    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(DEST_PORT);
    dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
    bzero(&(dest_addr.sin_zero),8);

    if(connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr))==-1)
    {
        printf("connect failed:%d\n",errno);
    }
    else
    {
        printf("[CrissLeung]connect success\n");
        while(1)
        {
            memset(rBuf,'\0',sizeof(rBuf));
            memset(sBuf,'\0',sizeof(sBuf));
            printf("[CrissLeung]:");
            gets(sBuf);
          //  printf("CrissLeung]:%s\n",sBuf);
            send(sockfd,sBuf,strlen(sBuf),0);
            recv(sockfd,rBuf,MAX_DATA,0);
            printf("[于淑媛]:%s\n",rBuf);
        }
    }
    close(sockfd);
    return 0;
}

相关资料 https://www.cnblogs.com/lihaibo-Leao/p/3981955.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值