UDP(socket)接続とデータケースをC++コードにパッケージします。



QTのプロファイルを設定する
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
 
LIBS += -lWs2_32   ##    window  Ws2_32.lib-l         
#-lWs2_32link Ws2_32.lib
 
SOURCES += main.cpp \
    udp.cpp
 
HEADERS += \
    udp.h
 
up.hファイルを作成するヽoo。ツ。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。H
ヽoo。ツ。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。H
 
›ifdef MYLINUX
ヽoo。ツ
ヽoo。ツ
ヽoo。ツ
ヽoo。ツ
皒define SOCKET int
同前
ヽoo。ツ
湖南省にある地名
 
class mudp
{
prvate:
    SOCKET st///クラスの内部メンバーは一般的にクラス外に露出していません。
public:
    myudp();
    myudp(const myudp&it);
    ~myudp();
int socket_bind(shot int port)
int socket_send(const char*IP,const char*buf,int len)
int socket_recv(char*buf、int len、char*srcIP)

 
ヽoo。ツ。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。H
 
3.作成up.cpp
#include 
#include 
#include "udp.h"
 
int myudp::socket_send(const char *IP, const char *buf, int len)
{
    //    socket,        socket      ,AF_INET    TCP/IP  
    //     SOCK_DGRAM     UDP  
    //          0
    st = socket(AF_INET, SOCK_DGRAM, 0);//    socket
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));//     addr;
    addr.sin_family = AF_INET;//       TCP/IP   
    addr.sin_port = htons(8080);//host to net short
    addr.sin_addr.s_addr = inet_addr(IP);
    //unsigned long laddr = inet_addr("192.168.6.200");
    //unsigned char *p = &laddr;
    //printf("%u,%u,%u,%u
",
*(p), *(p + 1),*(p + 2), *(p + 3));
 
    size_t rc = 0;
    //  udp  
    rc = sendto(st, buf, len, 0, (struct sockaddr *)&addr, sizeof(addr));
    return rc;
}
 
int myudp::socket_recv(char *buf, int len, char *srcIP)
{
        struct sockaddr_in sendaddr;
        memset(&sendaddr, 0, sizeof(sendaddr));
 
#ifdef MYLINUX
        socklen_t addrlen;
#else
        int addrlen;
#endif
        addrlen = sizeof(sendaddr);
        memset(buf, 0, len);
        //  udp  
        size_t rc = recvfrom(st, buf, len, 0, (struct sockaddr *)&sendaddr, &addrlen);
        //inet_ntoa(sendaddr.sin_addr);//           
        if (srcIP)
            strcpy(srcIP, inet_ntoa(sendaddr.sin_addr));
    return rc;
}
 
myudp::myudp()
{
#ifndef MYLINUX
    //   socket
    DWORD ver;
    WSADATA wsaData;
    ver = MAKEWORD(1, 1);//   WSAStatrtup   widnowssocket
    WSAStartup(ver, &wsaData);//windowssocket,   ,        
    //   socket  
    //    socket,        socket      ,AF_INET    TCP/IP  
    //     SOCK_DGRAM     UDP  
    //          0
    st = socket(AF_INET, SOCK_DGRAM, 0);//    socket
#endif
}
 
myudp::myudp(const myudp &it)
{
}
 
myudp::~myudp()
{
#ifdef MYLINUX
    close(st);
#else
    closesocket(st);//   socket     
    WSACleanup();//  win socket       
#endif
}
 
int myudp::socket_bind(short port)
{
    struct sockaddr_in addr;
    //     addr;
    memset(&addr, 0, sizeof(addr));
    //       TCP/IP   
    addr.sin_family = AF_INET;
    //host to net short
    addr.sin_port = htons(port);
    //IPIPIP    
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    int rc = 0;
    return bind(st, (struct sockaddr *)&addr, sizeof(addr));
}
4.main.cnの実現コード
#include 
#include "udp.h"
 
using namespace std;
 
int main(int argc, char *args[])
{
    if (argc > 1)
    {
        myudp udp;
        char buf[1024] = {0};
        while(1)
        {
            memset(buf, 0, sizeof(buf));
            gets(buf);
            udp.socket_send(args[1], buf, strlen(buf));
            if (strncmp(buf, "exit", 4) == 0)
                break;
        }
    }
    else
    {
        myudp udp;
        char buf[1024] = {0};
        if (udp.socket_bind(8080) > -1)
        {
            char ip[100] = {0};
            while(1)
            {
                memset(buf, 0, sizeof(buf));
                memset(ip, 0, sizeof(ip));
                udp.socket_recv(buf, sizeof(buf), ip);
                if (strncmp(buf, "exit", 4) == 0)
                    break;
                cout << buf << endl;
                cout << ip << endl;
            }
        }
    }
 
    cout << "over" << endl;
    return 0;
}