TCP套接字编程实例(一)

TCP套接字编程实例(一)

TCP套接字编程第一部分我们先用单线程简单实现客户端的“发”和服务器的“收”。话不多说,直接上代码。

1.Client部分:

 

#include
#include
#include
#include
#include
#include
#include
#include 
#include
 
#define IP "127.0.0.1"
#define PORT 7788
#define MAXLEN 1024
 
int main(int argc,char* argv[])
{
    int sock_fd = 0;
    int iret = 0;
    struct sockaddr_in sock_addr;
    char buf[MAXLEN] = {0};
 
    //创建socket
    if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket error");
        exit(1);
    }
 
    //发送连接服务器的请求
    memset(&sock_addr,0,sizeof(sock_addr));
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons(PORT);
    sock_addr.sin_addr.s_addr = inet_addr(IP);
 
    if(connect(sock_fd,(struct sockaddr*)(&sock_addr),sizeof(sock_addr))==-1)
    {
        perror("connect error");
        exit(1);
    }
    printf("connect success!\n");
 
    while(1) //发送数据
    {
        memset(buf,'\0',sizeof(buf));
        gets(buf);
        
        iret=write(sock_fd,buf,strlen(buf));
        printf("write data:%s,len=%d\n",buf,iret);
        
        if(strcmp(buf,"quit") == 0)
        {
            printf("即将退出 ...\n");
            sleep(3);
            break;
        }
    }
 
    close(sock_fd); //关闭套接字
 
    return 0;
}
#include
#include
#include
#include
#include
#include
#include 
#include
 
#define IP "127.0.0.1"
#define PORT 7788
#define MAXLEN 1024
 
int main(int argc,char* argv[])
{
    int sock_fd = 0;
    int iret = 0;
    struct sockaddr_in sock_addr;
    char buf[MAXLEN] = {0};
 
    //创建socket
    if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket error");
        exit(1);
    }
 
    //发送连接服务器的请求
    memset(&sock_addr,0,sizeof(sock_addr));
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons(PORT);
    sock_addr.sin_addr.s_addr = inet_addr(IP);
 
    if(connect(sock_fd,(struct sockaddr*)(&sock_addr),sizeof(sock_addr))==-1)
    {
        perror("connect error");
        exit(1);
    }
    printf("connect success!\n");
 
    while(1) //发送数据
    {
        memset(buf,'\0',sizeof(buf));
        gets(buf);
        
        iret=write(sock_fd,buf,strlen(buf));
        printf("write data:%s,len=%d\n",buf,iret);
        
        if(strcmp(buf,"quit") == 0)
        {
            printf("即将退出 ...\n");
            sleep(3);
            break;
        }
    }
 
    close(sock_fd); //关闭套接字
 
    return 0;
}

 

2.server部分

 

#include
#include
#include
#include
#include
#include
#include
#include
 
#define PORT 7788
#define IP "127.0.0.1"
 
int main(int argc,char* argv[])
{
    int sock,new_fd;
    struct sockaddr_in self_addr,recv_addr;
    int iret =0,len =0;
    char buf[100] = {'\0'};
    int fd = 0;
    int ret = 0;
 
    //创建套接字
    sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0)
    {
        perror("socket error");
        exit(0);
    }
 
    //绑定自己的端口号
    memset(&self_addr,0,sizeof(self_addr));
    self_addr.sin_family = AF_INET;
    self_addr.sin_port = htons(PORT);
    self_addr.sin_addr.s_addr = INADDR_ANY;
 
    if(bind(sock,(struct sockaddr*)&self_addr,sizeof(self_addr)) == -1)
    {
        perror("bind error");
        exit(0);
    }
 
    //监听
    if(listen(sock,5) == -1)
    {
        perror("listen error");
        exit(0);
    }
 
    while(1)
    {
        //接受客户端的连接请求
        memset(&recv_addr,0,sizeof(recv_addr));
        printf("wait for connect\n");
        if((new_fd = accept(sock,(struct sockaddr*)&recv_addr,&len)) == -1)
        {
            perror("accept error");
            exit(0);
        }
        printf("connect ok\n");
 
        //接收数据
        while(1)
        {
            if(read(new_fd,buf,sizeof(buf)) <= 0) //注意加上“=”,避免客户端退出服务器读到空数据而造成死循环
            {
                printf("client is outline\n");
                break;
            }
            else
                printf("buf is %s\n",buf);
            memset(buf,'\0',sizeof(buf));
        }
    }
 
    close(new_fd);
    close(sock); //关闭套接字
 
    return 0;
}
#include
#include
#include
#include
#include
#include
#include
 
#define PORT 7788
#define IP "127.0.0.1"
 
int main(int argc,char* argv[])
{
    int sock,new_fd;
    struct sockaddr_in self_addr,recv_addr;
    int iret =0,len =0;
    char buf[100] = {'\0'};
    int fd = 0;
    int ret = 0;
 
    //创建套接字
    sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0)
    {
        perror("socket error");
        exit(0);
    }
 
    //绑定自己的端口号
    memset(&self_addr,0,sizeof(self_addr));
    self_addr.sin_family = AF_INET;
    self_addr.sin_port = htons(PORT);
    self_addr.sin_addr.s_addr = INADDR_ANY;
 
    if(bind(sock,(struct sockaddr*)&self_addr,sizeof(self_addr)) == -1)
    {
        perror("bind error");
        exit(0);
    }
 
    //监听
    if(listen(sock,5) == -1)
    {
        perror("listen error");
        exit(0);
    }
 
    while(1)
    {
        //接受客户端的连接请求
        memset(&recv_addr,0,sizeof(recv_addr));
        printf("wait for connect\n");
        if((new_fd = accept(sock,(struct sockaddr*)&recv_addr,&len)) == -1)
        {
            perror("accept error");
            exit(0);
        }
        printf("connect ok\n");
 
        //接收数据
        while(1)
        {
            if(read(new_fd,buf,sizeof(buf)) <= 0) //注意加上“=”,避免客户端退出服务器读到空数据而造成死循环
            {
                printf("client is outline\n");
                break;
            }
            else
                printf("buf is %s\n",buf);
            memset(buf,'\0',sizeof(buf));
        }
    }
 
    close(new_fd);
    close(sock); //关闭套接字
 
    return 0;
}

 

结果:(Ubuntu的拼写错误请忽略)

 

至此,简单的TCP套接字编程就完成了,思路很简单,只是一些函数比较复杂而已,相关函数自行搜索了解其意照章使用即可。接下来,就是加上多线程,加上select等等,使其变得更实用,更灵活。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值