C++ socket学习(一)

socket通信过程

1. 服务端创建socket  (socket函数)
2. 服务端绑定端口  (bind函数)
3. 服务端监听端口  (listen函数)
4. 客户端向服务端请求连接 (connect函数)
5. 服务端接受连接请求 (accept函数)
6. 客户端和服务端通过读写socket通信 (recv/send函数)

头文件

windows

winsock2.h  定义socket及数据结构头文件`

linux

sys/types.h     //提供数据定义
sys/socket.h    //提供socket函数及数据结构
netinet/in.h    // 定义数据结构socketaddr_in
arpa/inet.h   //定义inet_addr函数
unistd  //定义close函数

阻塞式socket

服务器端

#ifndef __WIN32
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#else
#include <winsock2.h>
typedef int socklen_t
#pragma comment(lib, "ws2_32.lib")
#endif
#include <string.h>
#include <stdio.h>
int main()
{
    int fd;
#ifndef __WIN32
    socklen_t sock_len;
#else
    int sock_len;
    //初始化套接字环境
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("初始化套接字失败!");
        return 0;
    }
#endif
    sockaddr_in serverAddr, clientAddr;

    sock_len = sizeof(clientAddr);
    //创建一个TCP连接
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1)
    {
        printf("创建套接子失败!");
        return 0;
    }
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(4567);
#ifndef __WIN32
    serverAddr.sin_addr.s_addr = INADDR_ANY;
#else
    serverAddr.sin_addr.S_un.S_addr = INADDR_ANY;
#endif
    //绑定端口
    bind(fd, (sockaddr *)&serverAddr, sizeof(serverAddr));
    //监听端口
    listen(fd, 20);
    //接受客户信息
    int client = accept(fd, (sockaddr *)&clientAddr, (socklen_t*)&sock_len);
    char str[256] = {0};
    recv(client, str, sizeof(str), 0);
    printf("%s\n", str);
    strcat(str, " ... from server");
    send(client, str, sizeof(str), 0);

//关闭连接
#ifndef __WIN32
    close(client);
    close(fd);
#else
    closesocket(client);
    closesocket(fd);
    WSACleanup();
#endif

    return 0;
}

客户端

#ifndef __WIN32
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>  //inet_addr()
#include <unistd.h>
#else
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#endif
#include <string.h>
#include <stdio.h>
#define PORT 4567
int main()
{
    int fd;
#ifndef __WIN32
    socklen_t sock_len;
#else
    int sock_len;
    //初始化套接字环境
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("初始化套接字失败!");
        return 0;
    }
#endif
    sockaddr_in clientAddr;
    char ip[16];

    sock_len = sizeof(clientAddr);
    //创建一个TCP连接
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1)
    {
        printf("创建套接子失败!");
        return 0;
    }
    clientAddr.sin_family = AF_INET;
    clientAddr.sin_port = htons(PORT);
    //动态指定主机IP
    printf("Please enter IP address:");
    scanf("%s", &ip);
#ifndef __Win32
    clientAddr.sin_addr.s_addr = inet_addr(ip);
#else
    clientAddr.sin_addr.S_un.S_addr = inet_addr(ip);
#endif
    //连接服务器
    if (connect(fd, (sockaddr *)&clientAddr, sock_len) == -1)
    {
        printf("与服务器连接失败");
#ifndef __WIN32
        close(fd);
#else
        closesocket(fd);
#endif
    }
    const char *msg = "I'm from client";
    char buff[256];
    //发送消息
    send(fd, msg, strlen(msg) + 1, 0);
    recv(fd, buff, sizeof(buff), 0);
    printf("%s\n", buff);
//关闭连接
#ifndef __WIN32
    close(fd);
#else
    closesocket(fd);
    WSACleanup();
#endif

    return 0;
}

版权声明:本文为liouyi250原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。