100 lines
3.1 KiB
C
100 lines
3.1 KiB
C
#include "common.h"
|
||
|
||
//有些头文件不声明memmem
|
||
void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen);
|
||
|
||
void error(const char *error_info)
|
||
{
|
||
fprintf(stderr, "%s\n\n", error_info);
|
||
exit(1);
|
||
}
|
||
|
||
int8_t copy_new_mem(char *src, int src_len, char **dest)
|
||
{
|
||
*dest = (char *)malloc(src_len + 1);
|
||
if (*dest == NULL)
|
||
return 1;
|
||
memcpy(*dest, src, src_len);
|
||
*((*dest) + src_len) = '\0';
|
||
|
||
return 0;
|
||
}
|
||
|
||
/* 字符串替换,replace_memory为可以用free释放的指针 */
|
||
char *replace(char *replace_memory, int *replace_memory_len, const char *src, const int src_len, const char *dest, const int dest_len)
|
||
{
|
||
if (!replace_memory || !src || !dest)
|
||
return replace_memory;
|
||
|
||
char *p;
|
||
int diff;
|
||
|
||
if (src_len == dest_len) {
|
||
for (p = memmem(replace_memory, *replace_memory_len, src, src_len); p; p = memmem(p, *replace_memory_len - (p - replace_memory), src, src_len)) {
|
||
memcpy(p, dest, dest_len);
|
||
p += dest_len;
|
||
}
|
||
} else if (src_len < dest_len) {
|
||
int before_len;
|
||
char *before_end, *new_replace_memory;
|
||
|
||
diff = dest_len - src_len;
|
||
for (p = memmem(replace_memory, *replace_memory_len, src, src_len); p; p = memmem(p, *replace_memory_len - (p - replace_memory), src, src_len)) {
|
||
*replace_memory_len += diff;
|
||
before_len = p - replace_memory;
|
||
new_replace_memory = (char *)realloc(replace_memory, *replace_memory_len + 1);
|
||
if (new_replace_memory == NULL) {
|
||
free(replace_memory);
|
||
return NULL;
|
||
}
|
||
replace_memory = new_replace_memory;
|
||
before_end = replace_memory + before_len;
|
||
p = before_end + dest_len;
|
||
memmove(p, p - diff, *replace_memory_len - (p - replace_memory));
|
||
memcpy(before_end, dest, dest_len);
|
||
}
|
||
} else if (src_len > dest_len) {
|
||
diff = src_len - dest_len;
|
||
for (p = memmem(replace_memory, *replace_memory_len, src, src_len); p; p = memmem(p, *replace_memory_len - (p - replace_memory), src, src_len)) {
|
||
*replace_memory_len -= diff;
|
||
memcpy(p, dest, dest_len);
|
||
p += dest_len;
|
||
memmove(p, p + diff, *replace_memory_len - (p - replace_memory));
|
||
}
|
||
}
|
||
|
||
replace_memory[*replace_memory_len] = '\0';
|
||
return replace_memory;
|
||
}
|
||
|
||
/* 对数据进行编码 */
|
||
void dataEncode(char *data, int data_len, unsigned code)
|
||
{
|
||
while (data_len-- > 0)
|
||
data[data_len] ^= code;
|
||
}
|
||
|
||
/* 监听一个UDP接口 */
|
||
int udp_listen(char *ip, int port)
|
||
{
|
||
struct sockaddr_in addr;
|
||
int fd, opt = 1;
|
||
|
||
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
||
perror("udp socket");
|
||
exit(1);
|
||
}
|
||
setsockopt(fd, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt));
|
||
setsockopt(fd, SOL_IP, IP_RECVORIGDSTADDR, &opt, sizeof(opt));
|
||
memset(&addr, 0, sizeof(addr));
|
||
addr.sin_addr.s_addr = inet_addr(ip);
|
||
addr.sin_port = htons(port);
|
||
addr.sin_family = AF_INET;
|
||
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
|
||
perror("udp bind");
|
||
exit(1);
|
||
}
|
||
|
||
return fd;
|
||
}
|