dev 修复使用tcp-ipv6问题,优化内部函数

This commit is contained in:
zzy 2023-10-26 18:19:39 +08:00
parent ee66e7076a
commit c911153cca
3 changed files with 146 additions and 86 deletions

View File

@ -4,10 +4,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
// #define SSOCKET_VERSION_MAJOR 1
// #define SSOCKET_VERSION_MINOR 0
// #define SSOCKET_VERSION_PATCH
#include "sysenv.h" #include "sysenv.h"
#if _OS_WIN #if _OS_WIN
@ -24,7 +20,7 @@
#include <CoreWindow.h> #include <CoreWindow.h>
#define strcasecmp _stricmp #define strcasecmp _stricmp
#define strncasecmp _strnicmp #define strncasecmp _strnicmp
#define socklen_t int //#define socklen_t int
#elif LINUX_PART #elif LINUX_PART
#include <unistd.h> #include <unistd.h>
#include <sys/socket.h> #include <sys/socket.h>
@ -87,18 +83,21 @@ static inline void out_sock_err(FILE* output, int errcode);
static inline void get_sock_err(char* buff_128, size_t buff_len, int errcode); static inline void get_sock_err(char* buff_128, size_t buff_len, int errcode);
#define _SOCKET_TEST_IP "127.0.0.1" #define _SOCKET_TEST_IP "127.0.0.1"
#define _SOCKET_TEST_PORT 6789 #define _SOCKET_TEST_PORT 26789
static inline int _socket(SOCKET* sock, const char* ip, const char* port); static inline int _getaddrinfo(struct addrinfo* inf, struct addrinfo** resaddr,
static inline int _connect(SOCKET sock, const char* ip, const char* port); const char* ip, const char* port);
static inline int _bind(SOCKET sock, const char* ip, const char* port); static inline int _socket(SOCKET* sock, struct addrinfo* resaddr);
static inline int _bindlisten(SOCKET sock, const char* ip, const char* port); static inline int _connect(SOCKET sock, struct addrinfo* resaddr);
static inline int _bind(SOCKET sock, struct addrinfo* resaddr);
static inline int _bindlisten(SOCKET sock, struct addrinfo* resaddr);
static inline int _accept(SOCKET sock, SOCKET* client, struct addrinfo* inf);
static inline int _sock(SOCKET* sock, int af, int type); static inline int _sock(SOCKET* sock, int af, int type);
static inline int make_sock_tcp4(SOCKET* sock) { return _sock(sock, AF_INET, SOCK_STREAM); } static inline int make_sock_tcp4(SOCKET* sock) { return _sock(sock, AF_INET, SOCK_STREAM); }
static inline int make_sock_tcp6(SOCKET* sock) { return _sock(sock, AF_INET6, SOCK_STREAM); } static inline int make_sock_tcp6(SOCKET* sock) { return _sock(sock, AF_INET6, SOCK_STREAM); }
static inline int make_sock_udp4(SOCKET* sock) { return _sock(sock, AF_INET, SOCK_DGRAM); } static inline int make_sock_udp4(SOCKET* sock) { return _sock(sock, AF_INET, SOCK_DGRAM); }
static inline int make_sock_udp6(SOCKET* sock) { return _sock(sock, AF_INET6, SOCK_DGRAM); } static inline int make_sock_udp6(SOCKET* sock) { return _sock(sock, AF_INET6, SOCK_DGRAM); }
//不推荐 //not recommand and it will be remove
static inline int make_sock(SOCKET* sock) { return make_sock_tcp4(sock); }; static inline int make_sock(SOCKET* sock) { return make_sock_tcp4(sock); };
static inline int _sock(SOCKET* sock, int af, int type) { static inline int _sock(SOCKET* sock, int af, int type) {
@ -107,7 +106,6 @@ static inline int _sock(SOCKET* sock, int af, int type) {
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
return -ERR_SOCK_WSAStartup; return -ERR_SOCK_WSAStartup;
} }
if (HIBYTE(wsaData.wVersion) != 2 || \ if (HIBYTE(wsaData.wVersion) != 2 || \
LOBYTE(wsaData.wVersion) != 2) { LOBYTE(wsaData.wVersion) != 2) {
return -ERR_SOCK_DETERMINE_AGREEMENT; return -ERR_SOCK_DETERMINE_AGREEMENT;
@ -134,62 +132,59 @@ static inline int _sock_eai_res_map(int res) {
} }
} }
static inline int _socket(SOCKET* sock, const char* ip, const char* port) { // need to using freeaddrinfo to free <resaddr>
struct addrinfo inf = { 0 }; static inline int _getaddrinfo(struct addrinfo* inf, struct addrinfo** resaddr,
struct addrinfo* res_addr = NULL; const char* ip, const char* port) {
int res = getaddrinfo(ip, port, &inf, &res_addr); int res = getaddrinfo(ip, port, inf, resaddr);
if (res != 0) { if (res != 0) {
return -(_sock_eai_res_map(res)); return -(_sock_eai_res_map(res));
} }
for (struct addrinfo* p = res_addr; p != NULL; p = p->ai_next) { return ERR_SOCK_SUCCESS;
}
static inline int _socket(SOCKET* sock, struct addrinfo* resaddr) {
#ifdef WIN_PART
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
return -ERR_SOCK_WSAStartup;
}
if (HIBYTE(wsaData.wVersion) != 2 || \
LOBYTE(wsaData.wVersion) != 2) {
return -ERR_SOCK_DETERMINE_AGREEMENT;
}
#endif
for (struct addrinfo* p = resaddr; p != NULL; p = p->ai_next) {
if (*sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) { if (*sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) {
if (*sock == INVALID_SOCKET) { if (*sock == INVALID_SOCKET) {
return -ERR_SOCK_CREATE_SOCKET; return -ERR_SOCK_CREATE_SOCKET;
} }
freeaddrinfo(res_addr); return ERR_SOCK_SUCCESS;
return -ERR_SOCK_SUCCESS;
} }
} }
freeaddrinfo(res_addr);
return -ERR_SOCK_CONNECT; return -ERR_SOCK_CONNECT;
} }
static inline int _connect(SOCKET sock, const char* ip, const char* port) { static inline int _connect(SOCKET sock, struct addrinfo* resaddr) {
struct addrinfo inf = { 0 }; for (struct addrinfo* p = resaddr; p != NULL; p = p->ai_next) {
struct addrinfo* res_addr = NULL;
int res = getaddrinfo(ip, port, &inf, &res_addr);
if (res != 0) {
return _sock_eai_res_map(res);
}
for (struct addrinfo* p = res_addr; p != NULL; p = p->ai_next) {
if (connect(sock, p->ai_addr, p->ai_addrlen) == 0) { if (connect(sock, p->ai_addr, p->ai_addrlen) == 0) {
freeaddrinfo(res_addr);
return ERR_SOCK_SUCCESS; return ERR_SOCK_SUCCESS;
} }
} }
freeaddrinfo(res_addr);
return -ERR_SOCK_CONNECT; return -ERR_SOCK_CONNECT;
} }
static inline int _bind(SOCKET sock, const char* ip, const char* port) { static inline int _bind(SOCKET sock, struct addrinfo* resaddr) {
struct addrinfo inf = { 0 }; for (struct addrinfo* p = resaddr; p != NULL; p = p->ai_next) {
struct addrinfo* res_addr = NULL;
int res = getaddrinfo(ip, port, &inf, &res_addr);
if (res != 0) {
return -ERR_SOCK_ADDRINFO;
}
for (struct addrinfo* p = res_addr; p != NULL; p = p->ai_next) {
if (bind(sock, p->ai_addr, p->ai_addrlen) == 0) { if (bind(sock, p->ai_addr, p->ai_addrlen) == 0) {
freeaddrinfo(res_addr);
return ERR_SOCK_SUCCESS; return ERR_SOCK_SUCCESS;
} }
} }
freeaddrinfo(res_addr);
return -ERR_SOCK_CONNECT; return -ERR_SOCK_CONNECT;
} }
static inline int _bindlisten(SOCKET sock, const char* ip, const char* port) { static inline int _bindlisten(SOCKET sock, struct addrinfo* resaddr) {
int res = _bind(sock, ip, port); int res = _bind(sock, resaddr);
if(res == ERR_SOCK_SUCCESS){ if(res == ERR_SOCK_SUCCESS){
if (listen(sock, SOMAXCONN) == 0) { if (listen(sock, SOMAXCONN) == 0) {
return ERR_SOCK_SUCCESS; return ERR_SOCK_SUCCESS;
@ -199,83 +194,151 @@ static inline int _bindlisten(SOCKET sock, const char* ip, const char* port) {
return res; return res;
} }
static inline int sock_connect(SOCKET sock, const char* connect_ip, unsigned short port) { static inline int _accept(SOCKET sock, SOCKET* client, struct addrinfo* inf) {
char buf[8] = { 0 }; int res = ERR_SOCK_SUCCESS;
sprintf(buf, "%u", port); socklen_t addrLen = sizeof(struct addrinfo);
return _connect(sock, connect_ip, buf);
}
static inline int sock_bindlisten(SOCKET sock, const char* server_ip, unsigned short port) {
char buf[8] = { 0 };
sprintf(buf, "%u", port);
return _bindlisten(sock, server_ip, buf);
}
static inline int sock_accpet(SOCKET sock,SOCKET* client, char** accept_ip, unsigned short* port) {
struct sockaddr_in caddr = { 0 };
socklen_t addrLen = sizeof(struct sockaddr_in);
if (client == NULL) { if (client == NULL) {
return -ERR_SOCK_NULLPTR; return -ERR_SOCK_NULLPTR;
} }
*client = accept(sock,(struct sockaddr*) &caddr, &addrLen); *client = accept(sock, (struct sockaddr*)inf, &addrLen);
if (*client == -1) { if (*client == INVALID_SOCKET) {
return -ERR_SOCK_ACCEPT;
}
return ERR_SOCK_SUCCESS;
}
static inline int sock_connect(SOCKET sock, const char* connect_ip, unsigned short port) {
int res = ERR_SOCK_SUCCESS;
char buf[8] = { 0 };
sprintf(buf, "%u", port);
struct addrinfo inf = { 0 };
struct addrinfo* resaddr = NULL;
res = _getaddrinfo(&inf, &resaddr, connect_ip, buf);
if (res != ERR_SOCK_SUCCESS) goto RES;
res = _connect(sock, resaddr);
if (res != ERR_SOCK_SUCCESS) goto RES;
RES:
if (resaddr) freeaddrinfo(resaddr);
return res;
}
static inline int sock_bindlisten(SOCKET sock, const char* server_ip, unsigned short port) {
int res = ERR_SOCK_SUCCESS;
char buf[8] = { 0 };
sprintf(buf, "%u", port);
struct addrinfo inf = { 0 };
struct addrinfo* resaddr = NULL;
res = _getaddrinfo(&inf, &resaddr, server_ip, buf);
if (res != ERR_SOCK_SUCCESS) goto RES;
res = _bindlisten(sock, resaddr);
if (res != ERR_SOCK_SUCCESS) goto RES;
RES:
if (resaddr) freeaddrinfo(resaddr);
return res;
}
static inline int sock_accpet(SOCKET sock,SOCKET* client, char** accept_ip, unsigned short* port) {
int res = 0;
struct sockaddr_storage inf;
//struct addrinfo inf;
//res = _accept(sock, client, &inf);
//if (res != ERR_SOCK_SUCCESS) return res;
//if (accept_ip == NULL) return ERR_SOCK_SUCCESS;
socklen_t addrLen = sizeof(struct sockaddr_storage);
if (client == NULL) {
return -ERR_SOCK_NULLPTR;
}
*client = accept(sock, (struct sockaddr*)&inf, &addrLen);
if (*client == INVALID_SOCKET) {
return -ERR_SOCK_ACCEPT; return -ERR_SOCK_ACCEPT;
} }
char* ip = (char*)malloc(32); char* hostname = (char*)malloc(32);
if(ip == NULL) { char* servInfo = (char*)malloc(8);
if(hostname == NULL) {
return -ERR_SOCK_MALLOC; return -ERR_SOCK_MALLOC;
} }
if (servInfo == NULL) {
int buffLen = strlen( inet_ntoa(caddr.sin_addr) ); free(hostname);
if(accept_ip != NULL) { return -ERR_SOCK_MALLOC;
strncpy(ip, inet_ntoa(caddr.sin_addr), buffLen);
ip[buffLen] = '\0';
*accept_ip = ip;
} }
res = getnameinfo((struct sockaddr*)&inf, sizeof(struct addrinfo),
hostname, 32, servInfo, 8, NI_NUMERICHOST);// NI_NUMERICHOST NI_NUMERICSERV
if (res != 0) {
return -ERR_SOCK_ACCEPT;
}
*accept_ip = hostname;
if (port != NULL) { if (port != NULL) {
*port = ntohs(caddr.sin_port); *port = (unsigned short)atoi(servInfo);
} }
return ERR_SOCK_SUCCESS; return ERR_SOCK_SUCCESS;
} }
static inline int make_server_sock(SOCKET* sock, const char* server_ip, unsigned short port) { static inline int make_server_sock(SOCKET* sock, const char* server_ip, unsigned short port) {
#ifdef WIN_PART
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
return -ERR_SOCK_WSAStartup;
}
if (HIBYTE(wsaData.wVersion) != 2 || \
LOBYTE(wsaData.wVersion) != 2) {
return -ERR_SOCK_DETERMINE_AGREEMENT;
}
#endif
int res = ERR_SOCK_SUCCESS;
char buf[8] = { 0 }; char buf[8] = { 0 };
sprintf(buf, "%u", port); sprintf(buf, "%u", port);
struct addrinfo inf = { 0 };
struct addrinfo *resaddr = NULL;
res = _getaddrinfo(&inf, &resaddr, server_ip, buf);
if (res != ERR_SOCK_SUCCESS) goto RES;
int res = _socket(sock, server_ip, buf); res = _socket(sock, resaddr);
if(res != ERR_SOCK_SUCCESS) { if (res != ERR_SOCK_SUCCESS) goto RES;
res = _bindlisten(*sock, resaddr);
if (res != ERR_SOCK_SUCCESS) goto RES;
RES:
if (resaddr) freeaddrinfo(resaddr);
return res; return res;
} }
res = sock_bindlisten(*sock, server_ip, port);
if(res != ERR_SOCK_SUCCESS) {
return res;
}
return ERR_SOCK_SUCCESS;
}
static inline int make_client_sock(SOCKET* sock, const char* connect_ip, unsigned short port) { static inline int make_client_sock(SOCKET* sock, const char* connect_ip, unsigned short port) {
#ifdef WIN_PART
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
return -ERR_SOCK_WSAStartup;
}
if (HIBYTE(wsaData.wVersion) != 2 || \
LOBYTE(wsaData.wVersion) != 2) {
return -ERR_SOCK_DETERMINE_AGREEMENT;
}
#endif
int res = ERR_SOCK_SUCCESS;
char buf[8] = { 0 }; char buf[8] = { 0 };
sprintf(buf, "%u", port); sprintf(buf, "%u", port);
struct addrinfo inf = { 0 };
struct addrinfo* resaddr = NULL;
res = _getaddrinfo(&inf, &resaddr, connect_ip, buf);
if (res != ERR_SOCK_SUCCESS) goto RES;
int res = _socket(sock, connect_ip, buf); res = _socket(sock, resaddr);
if(res != ERR_SOCK_SUCCESS) { if (res != ERR_SOCK_SUCCESS) goto RES;
return res;
}
if(connect_ip) { if(connect_ip) {
res = sock_connect(*sock, connect_ip, port); res = _connect(*sock, resaddr);
if(res != ERR_SOCK_SUCCESS) { if (res != ERR_SOCK_SUCCESS) goto RES;
}
RES:
if (resaddr) freeaddrinfo(resaddr);
return res; return res;
} }
}
return ERR_SOCK_SUCCESS;
}
static inline void close_sock(SOCKET sock) { static inline void close_sock(SOCKET sock) {
if(sock == -1) return; if(sock == -1) return;

View File

@ -2,7 +2,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <ssocket.h> #include <ssocket.h>
// #include <tthread.h>
#include <tthread.h> #include <tthread.h>
SOCKET cfd; SOCKET cfd;
@ -31,7 +30,7 @@ int main(int argc, char** argv)
int res; int res;
char Buf[1024] = { 0 }; char Buf[1024] = { 0 };
printf("connect server...\n"); printf("connect server...\n");
res = make_client_sock(&cfd, _SOCKET_TEST_IP, _SOCKET_TEST_PORT); res = make_client_sock(&cfd, "::1", _SOCKET_TEST_PORT);
if (res != 0) { if (res != 0) {
printf("error client sock\nerror code:%d\npress enter to continue\n", res); printf("error client sock\nerror code:%d\npress enter to continue\n", res);
getchar(); getchar();

View File

@ -3,7 +3,6 @@
#include <limits.h> #include <limits.h>
#include <ssocket.h> #include <ssocket.h>
#define _THREAD_H_
#include <tthread.h> #include <tthread.h>
#define CLIENT_SIZE 32 #define CLIENT_SIZE 32
@ -85,9 +84,8 @@ void acceptfunc(void* param) {
int main() int main()
{ {
char Buf[128]; char Buf[128];
int res = make_server_sock(&sfd, _SOCKET_TEST_IP, _SOCKET_TEST_PORT); int res = make_server_sock(&sfd, "::1", _SOCKET_TEST_PORT);
if(res != 0) { if(res != 0) {
printf("server start error\npress enter to continue"); printf("server start error\npress enter to continue");
getchar(); getchar();