C ソケット通信 sample

 


from https://qiita.com/kiki0817/items/343ee28a7cf73a14ebca



D1_word_read.c
#include <stdio.h> //printf(), fprintf(), perror()
#include <sys/socket.h> //socket(), bind(), accept(), listen()
#include <arpa/inet.h> // struct sockaddr_in, struct sockaddr, inet_ntoa(), inet_aton()
#include <stdlib.h> //atoi(), exit(), EXIT_FAILURE, EXIT_SUCCESS
#include <string.h> //memset(), strcmp()
#include <unistd.h> //close()

#define MSGSIZE 1024
#define BUFSIZE (MSGSIZE + 1)

int server_open(const char *address, unsigned short port) {
    int server;
    struct sockaddr_in sockaddr;

    memset(&sockaddr, 0, sizeof(sockaddr));
    sockaddr.sin_family = AF_INET;
    if (inet_aton(address, &sockaddr.sin_addr) == 0) {
        fprintf(stderr, "Invalid IP Address.\n");
        exit(EXIT_FAILURE);
    }

    if (port == 0) {
        fprintf(stderr, "invalid port number.\n");
        exit(EXIT_FAILURE);
    }
    sockaddr.sin_port = htons(port);

    if ((server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
        perror("socket() failed.");
        exit(EXIT_FAILURE);
    }

    if (connect(server, (struct sockaddr*) &sockaddr, sizeof(sockaddr)) < 0) {
        perror("connect() failed.");
        exit(EXIT_FAILURE);
    }
    printf("connect to %s\n", inet_ntoa(sockaddr.sin_addr));

    return server;
}
void server_send(int server, const char *data, int size) {
    if (send(server, data, size, 0) <= 0) {
        perror("send() failed.");
        exit(EXIT_FAILURE);
    }
}
int server_receive(int server, char *buffer) {
    int totalSize = 0;
    int receivedSize = recv(server, &buffer[totalSize], 100, 0);

    if (receivedSize > 0) {
        return receivedSize;
    }
    else if (receivedSize == 0) {
        perror("ERR_EMPTY_RESPONSE");
        exit(EXIT_FAILURE);
    }
    else {
        perror("recv() failed.");
        exit(EXIT_FAILURE);
    }
}
void server_close(int server) {
    if (close(server) == 0) {
        perror("close() failed.");
        exit(EXIT_FAILURE);
    }
}
int request(char *buffer, int size) {
    int i;
    char cmd[BUFSIZE] = "500000FF03FF000018002004010000D*0000010001";
    for (i = 0; i<strlen(cmd); i++) {
        buffer[i] = cmd[i];
    }
    return strlen(buffer);
}
int main(int argc, char* argv[]) {
    const char *address = "192.168.0.71";
    unsigned short port = (unsigned short)atoi("5015");
    int server = server_open(address, port);
    char send_buffer[BUFSIZE];
    char recv_buffer[BUFSIZE];
    int size = request(send_buffer, BUFSIZE);

    printf("%s\n", send_buffer);
    server_send(server, send_buffer, size);
    size = server_receive(server, recv_buffer);
    printf("%s\n", recv_buffer);

}

ソケット通信のプログラムはC言語で学ぶソケットAPI入門 第1回 サーバ編を参考にさせていただきました.

留言

熱門文章