中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

沈陽(yáng)酒店企業(yè)網(wǎng)站制作天門(mén)網(wǎng)站建設(shè)

沈陽(yáng)酒店企業(yè)網(wǎng)站制作,天門(mén)網(wǎng)站建設(shè),wordpress修改站點(diǎn)logo大小,哈爾濱建站系統(tǒng)和udp一樣&#xff0c;我們需要實(shí)現(xiàn)和系統(tǒng)調(diào)用一樣的接口來(lái)實(shí)現(xiàn)我們的tcp server。先來(lái)看看我們之前寫(xiě)的unix_tcp使用了哪些接口&#xff0c;這邊我加上兩個(gè)系統(tǒng)調(diào)用&#xff0c;分別是接收數(shù)據(jù)和發(fā)送數(shù)據(jù)。 #include <stdio.h> #include <arpa/inet.h> #include …

和udp一樣,我們需要實(shí)現(xiàn)和系統(tǒng)調(diào)用一樣的接口來(lái)實(shí)現(xiàn)我們的tcp server。先來(lái)看看我們之前寫(xiě)的unix_tcp使用了哪些接口,這邊我加上兩個(gè)系統(tǒng)調(diào)用,分別是接收數(shù)據(jù)和發(fā)送數(shù)據(jù)。

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>int main(int argc, char* argv) {int sock = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_family = AF_INET;servaddr.sin_port = htons(9999);bind(sock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr));listen(sock, 10);struct sockaddr_in clientaddr;socklen_t len = sizeof(clientaddr);char buffer[64] = {0};int fd = accept(sock, (struct sockaddr*)&clientaddr, &len);while (1) {int nb_recv = recv(fd, buffer, 64, 0);if (nb_recv > 0) {printf("tcp recv : %s\n", buffer);send(fd, buffer, nb_recv, 0);memset(buffer, 0, 64);}}return 0;
}
  • socket

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240809084354.png

  • bind

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240809084428.png

  • listen

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240809084444.png

  • accept

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240809084509.png

  • recv

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240809084532.png

  • send

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240809084601.png

tcp的posix實(shí)現(xiàn)

bitmap

static struct localhost* get_host_fromfd(int sockfd) {struct localhost* htp = get_lhost_instance();struct localhost* host;for(host = htp; host != NULL; host = host->next) {if (host->fd == sockfd) {return host;}}struct ln_tcp_stream* stream;struct ln_tcp_table* table = get_tcp_table_instance();for(stream = table->streams; stream != NULL; stream = stream->next) {if (stream->fd == sockfd) {return stream;}}return NULL;
}

根據(jù)sockfd來(lái)搜索對(duì)應(yīng)的控制塊(tcp和udp同一個(gè)函數(shù))。在之前的udp api實(shí)現(xiàn)的過(guò)程中實(shí)現(xiàn)了一個(gè)偽bitmap(后續(xù)會(huì)完善的)。現(xiàn)在加上了tcp,在函數(shù)中加上tcp控制塊相關(guān)的遍歷條件。

tcp server的最后兩個(gè)狀態(tài)

static int ln_tcp_handle_close_wait(struct ln_tcp_stream* stream, struct rte_tcp_hdr* tcphdr) {if (tcphdr->tcp_flags & RTE_TCP_FIN_FLAG) {if (stream->status == LN_TCP_STATUS_CLOSE_WAIT) {//}}return 0;
}static int ln_tcp_handle_last_ack(struct ln_tcp_stream* stream, struct rte_tcp_hdr* tcphdr) {if (tcphdr->tcp_flags & RTE_TCP_ACK_FLAG) {if (stream->status == LN_TCP_STATUS_LAST_ACK) {stream->status = LN_TCP_STATUS_CLOSED;struct ln_tcp_table* table = get_tcp_table_instance();LL_REMOVE(stream, table->streams);table->count--;rte_ring_free(stream->recvbuf);rte_ring_free(stream->sendbuf);rte_free(stream);}}return 0;
}

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240809100144.png

修改一些之前的API

由于tcp和udp都有創(chuàng)建套接字,綁定等通用的部分,所以我們要在之前寫(xiě)的api上做一些增加和修改,讓TCP和UDP都可以使用他們。

socket創(chuàng)建套接字
static struct localhost* get_host_fromip_port(uint32_t ip, uint16_t port, uint8_t proto) {struct localhost* htp = get_lhost_instance();struct localhost* host;for(host = htp; host != NULL; host = host->next) {if (host->localip == ip && host->localport == port && host->protocol == proto) {return host;}}return NULL;
}int nsocket(__attribute__((unused)) int domain, int type, __attribute__((unused)) int protocol) {int fd = get_fd_frombitmap();if (type == SOCK_DGRAM) {struct localhost* host = rte_malloc("localhost", sizeof(struct localhost), 0);if (host == NULL) {return -1;}memset(host, 0, sizeof(struct localhost));host->fd = fd;if (type == SOCK_DGRAM) {host->protocol = IPPROTO_UDP;}host->recvbuf = rte_ring_create("recv buf", RING_SIZE, rte_socket_id(), RING_F_SC_DEQ | RING_F_SP_ENQ);if (host->recvbuf == NULL) {rte_free(host);return -1;}host->sendbuf = rte_ring_create("send buf", RING_SIZE, rte_socket_id(), RING_F_SC_DEQ | RING_F_SP_ENQ);if (host->sendbuf == NULL) {rte_ring_free(host->recvbuf);rte_free(host);return -1;}pthread_cond_t blank_cond = PTHREAD_COND_INITIALIZER;pthread_mutex_t blank_mutex = PTHREAD_MUTEX_INITIALIZER;rte_memcpy(&host->mutex, &blank_mutex, sizeof(pthread_mutex_t));rte_memcpy(&host->cond, &blank_cond, sizeof(pthread_cond_t));struct localhost* lhp = get_lhost_instance();LL_ADD(host, lhp);}else if (type == SOCK_STREAM) {struct ln_tcp_stream* stream = rte_malloc("ln_tcp_stream", sizeof(struct ln_tcp_stream), 0);if (stream == NULL) {return -1;}stream->fd = fd;stream->proto = IPPROTO_TCP;stream->next = stream->prev = NULL;stream->recvbuf = rte_ring_create("tcp recv buf", RING_SIZE, rte_socket_id(), RING_F_SC_DEQ | RING_F_SP_ENQ);if (stream->recvbuf == NULL) {rte_free(stream);return -1;}stream->sendbuf = rte_ring_create("tcp send buf", RING_SIZE, rte_socket_id(), RING_F_SC_DEQ | RING_F_SP_ENQ);if (stream->sendbuf == NULL) {rte_ring_free(stream->sendbuf);rte_free(stream);return -1;}pthread_cond_t blank_cond = PTHREAD_COND_INITIALIZER;pthread_mutex_t blank_mutex = PTHREAD_MUTEX_INITIALIZER;rte_memcpy(&stream->cond, &blank_cond, sizeof(pthread_cond_t));rte_memcpy(&stream->mutex, &blank_mutex, sizeof(pthread_mutex_t));struct ln_tcp_table* table - get_tcp_table_instance();LL_ADD(stream, table->streams);table->count++;}return fd;
}

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/20240813175727.png

bind綁定
int nbind(int sockfd, const struct sockaddr *addr, __attribute__((unused)) socklen_t addrlen) {void* hostinfo = get_host_fromfd(sockfd);if (hostinfo == NULL) {return -1;}struct localhost* host = (struct localhost*)hostinfo;if (host->protocol == IPPROTO_UDP) {if (host == NULL) {return -1;}const struct sockaddr_in* laddr = (const struct sockaddr_in*)addr;host->localport = laddr->sin_port;rte_memcpy(&host->localip, &laddr->sin_addr.s_addr, sizeof(uint32_t));rte_memcpy(host->localmac, nSrcMac, RTE_ETHER_ADDR_LEN);}else {struct ln_tcp_stream* stream = (struct ln_tcp_stream*)hostinfo;const struct sockaddr_in* laddr = (const struct sockaddr_in*)addr;stream->dport = laddr->sin_port;rte_memcpy(&stream->dip, &laddr->sin_addr.s_addr, sizeof(uint32_t));rte_memcpy(&stream->localmac, nSrcMac, RTE_ETHER_ADDR_LEN);stream->status = LN_TCP_STATUS_CLOSED;}return 0;
}
close
int nclose(int fd) {void* hostinfo = get_host_fromfd(fd);if (hostinfo == NULL) {return -1;}struct localhost* host = (struct localhost*)hostinfo;if (host->protocol == IPPROTO_UDP) {struct localhost* lhp = get_lhost_instance();LL_REMOVE(host, lhp);if (host->recvbuf) {rte_ring_free(host->recvbuf);}if (host->sendbuf) {rte_ring_free(host->sendbuf);}rte_free(host);set_fd_frombitmap(fd);}else if (host->protocol == IPPROTO_TCP){struct ln_tcp_stream* stream = (struct ln_tcp_stream*)hostinfo;if (stream->status != LN_TCP_STATUS_LISTEN) {struct ln_tcp_fragment* fragment = rte_malloc("close frag", sizeof(struct ln_tcp_fragment), 0);if (fragment == NULL) {return -1;}memset(fragment, 0, sizeof(struct ln_tcp_stream));fragment->sport = stream->dport;fragment->dport = stream->sport;fragment->acknum = stream->recv_next;fragment->seqnum = stream->recv_next;fragment->windows = LN_TCP_INITIAL_WINDOWS;fragment->hdr_off = 0x50;fragment->tcp_flags = RTE_TCP_FIN_FLAG | RTE_TCP_ACK_FLAG;rte_ring_mp_enqueue(stream->sendbuf, (void*)fragment);stream->status = LN_TCP_STATUS_LAST_ACK;set_fd_frombitmap(fd);}else {struct ln_tcp_table* tb = get_tcp_table_instance();LL_REMOVE(stream, tb->streams);rte_free(stream);}}return 0;
}

tcp的專(zhuān)有API

listen監(jiān)聽(tīng)
int nlisten(int sockfd, __attribute__((unused))int backlog) {void* hostinfo = get_host_fromfd(sockfd);if (hostinfo == NULL) {return -1;}struct ln_tcp_stream* stream = (struct ln_tcp_stream*)hostinfo;if (stream->proto == IPPROTO_TCP) {stream->status = LN_TCP_STATUS_LISTEN;}return 0;
}
accept建立連接
int naccept(int sockfd, struct sockaddr *addr, __attribute__((unused))socklen_t *addrlen) {void* hostinfo = get_host_fromfd(sockfd);if (hostinfo == NULL) {return -1;}struct ln_tcp_stream* stream = (struct ln_tcp_stream*)hostinfo;if (stream->proto == IPPROTO_TCP) {struct ln_tcp_stream* apt = NULL;pthread_mutex_lock(&stream->mutex);while ((apt = ln_get_accept_stream(stream->dport)) == NULL) {pthread_cond_wait(&stream->cond, &stream->mutex);}pthread_mutex_unlock(&stream->mutex);struct sockaddr_in* addri = (struct sockaddr_in*)addr;addri->sin_port = apt->sport;rte_memcpy(&addri->sin_addr.s_addr, &apt->sip, sizeof(uint32_t));return apt->fd;}return -1;
}

參考資料:https://github.com/0voice

http://www.risenshineclean.com/news/51646.html

相關(guān)文章:

  • 泉州網(wǎng)頁(yè)搜索排名提升杭州網(wǎng)站建設(shè)方案優(yōu)化
  • 賓館的網(wǎng)站回款如何做分錄群排名優(yōu)化軟件
  • 德陽(yáng)seo網(wǎng)站建設(shè)重慶seo
  • wordpress給用戶(hù)發(fā)送郵件googleseo推廣
  • 無(wú)錫大型網(wǎng)站建設(shè)公司seo排名優(yōu)化軟件有
  • 普通銀行卡可以做國(guó)外網(wǎng)站購(gòu)物信用卡使用嗎哈爾濱seo網(wǎng)絡(luò)推廣
  • 中企動(dòng)力 35 做網(wǎng)站站長(zhǎng)工具綜合權(quán)重查詢(xún)
  • 武漢城市建設(shè)招標(biāo)網(wǎng)站seo的關(guān)鍵詞無(wú)需
  • 網(wǎng)站專(zhuān)業(yè)建設(shè)公司抖音搜索優(yōu)化
  • 做照片軟件seo博客寫(xiě)作
  • wordpress靜態(tài)生成西安優(yōu)化外
  • 做視頻的素材什么網(wǎng)站好網(wǎng)絡(luò)推廣的話(huà)術(shù)怎么說(shuō)
  • 北京市房山區(qū)住房和城鄉(xiāng)建設(shè)委員會(huì)網(wǎng)站網(wǎng)推公司
  • 免費(fèi)海報(bào)在線(xiàn)制作網(wǎng)站百度客戶(hù)管理系統(tǒng)登錄
  • 廣東官網(wǎng)網(wǎng)站建設(shè)哪家好二十個(gè)優(yōu)化
  • 北京P2P公司網(wǎng)站建設(shè)無(wú)代碼網(wǎng)站開(kāi)發(fā)平臺(tái)
  • 模塊建站平臺(tái)專(zhuān)業(yè)的推廣公司
  • b站視頻播放量網(wǎng)站長(zhǎng)沙快速排名優(yōu)化
  • 如何查看網(wǎng)站是哪家公司做的百度2022第三季度財(cái)報(bào)
  • 攝影網(wǎng)站設(shè)計(jì)圖片網(wǎng)絡(luò)營(yíng)銷(xiāo)服務(wù)的特點(diǎn)
  • 做網(wǎng)上兼職的網(wǎng)站優(yōu)秀營(yíng)銷(xiāo)軟文范例800字
  • 怎樣建設(shè)一個(gè)購(gòu)物網(wǎng)站廣州疫情升級(jí)
  • 昆明網(wǎng)站建設(shè)加q.479185700松原市新聞
  • designer怎么做網(wǎng)站四川網(wǎng)站seo
  • 學(xué)校網(wǎng)站建設(shè)企業(yè)接推廣怎么收費(fèi)
  • 廈門(mén)中小企業(yè)網(wǎng)站制作網(wǎng)絡(luò)媒體發(fā)稿平臺(tái)
  • 做圖片網(wǎng)站 服務(wù)器蘇州網(wǎng)站制作開(kāi)發(fā)公司
  • 河南洛陽(yáng)網(wǎng)站建設(shè)seo工具下載
  • 企業(yè)網(wǎng)站建設(shè)費(fèi)現(xiàn)金流科目seo公司官網(wǎng)
  • 中國(guó)最大的新聞網(wǎng)站合肥seo推廣排名