C/C++ socket编程

转:C++ Socket 编程
转:TCP与SOCKET的三次握手的对应关系
最近在学习C++ socket编程,看到这篇文章较好,这里使用本机作为客户端与服务器端实践一遍.
使用Ubuntu18.04, codeblock环境

服务器端:
socket→bind→listen→(等候客户端发送连接请求) →accept→send→close

#include<stdio.h>//提供printf/perror函数
#include<stdlib.h>//提供exit函数
#include<errno.h>//无用
#include<string.h>//提供bzero函数
#include<sys/types.h>//无用
#include<netinet/in.h>//无用
#include<sys/socket.h>//无用
#include<sys/wait.h>//提供waitpid函数
#include<unistd.h>//提供fork/close函数
#include<arpa/inet.h>//提供inet_ntoa函数
#define MYPORT 3490//服务器端口
#define BACKLOG 10//允许服务器

int main()
{
    int sockfd, new_fd;
    sockaddr_in my_addr;
    sockaddr_in their_addr;
    unsigned int sin_size;
    printf("start server...\n");
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd == -1)
    {
        perror("socket error!");
        exit(1);
    }
    my_addr.sin_family = AF_INET;
    my_addr.sin_addr.s_addr = INADDR_ANY;
    my_addr.sin_port = htons(MYPORT);
    bzero(&(my_addr.sin_zero),sizeof(my_addr.sin_zero));

    if(bind(sockfd,(sockaddr *)&my_addr,sizeof(sockaddr)) == -1)
    {
        perror("bind is error!");
        exit(1);
    }
    if(listen(sockfd,BACKLOG) == -1)
    {
        perror("listen is error!");
        exit(1);
    }

    while(1)
    {
        sin_size = sizeof(sockaddr_in);
        if ((new_fd = accept(sockfd, (sockaddr *)&their_addr, &sin_size)) == -1)
        {
            perror("accept is error");
            continue;
        }
        printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));
        if(!fork())
        {
            if(send(new_fd, "Hello, world!\n", 14, 0) == -1)
            {
                perror("send is error!");
                close(new_fd);
                exit(0);
            }
            close(new_fd);
        }
        while(waitpid(-1,NULL,WNOHANG) > 0);
    }
    return 0;
}

客户端:
socket→connect→(等候服务器端响应)→recv→close

#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<arpa/inet.h>
#include<netdb.h>
#include <unistd.h>

#define PORT 3490
#define MAXDATASIZE 100

int main()
{
    int sockfd,numbytes;
    char buf[MAXDATASIZE];
    sockaddr_in their_addr;
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket is error");
        exit(1);
    }
    their_addr.sin_family = AF_INET;
    their_addr.sin_port = htons(PORT);
    their_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(their_addr.sin_zero),sizeof(their_addr.sin_zero));
    if(connect(sockfd, (sockaddr *)&their_addr, sizeof(sockaddr)) == -1)
    {
        perror("connect is error!");
        exit(1);
    }
    if((numbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
    {
        perror("recv is error");
        exit(1);
    }
    buf[numbytes] = '\0';
    printf("received:%s", buf);
    close(sockfd);
    return 0;
}

先运行服务器端程序,再运行客户端程序,
服务器端客户端
如果先运行客户端,则会connect() 发出confusion警告.
先运行客户端

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值