tcp 客户、服务器程序示例

1)client 从标准输入读入一行文本,并写给服务器。
2)服务器从网络输入读入这行文本,并回射给客户。
3)客户从网络输入读入这行回射的文本,显示在标准输出上

标准输入—–fgets—-> tcp 客户—write——————-read–>tcp 服务器

标准输出<—-fputs—–tcp 客户<—read——————-write—tcp 服务器

client 代码

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

void str_cli(FILE *fp, int sockfd)
{

    char sendline[1024], recvline[1024];
    while( fgets(sendline, 1024, fp) != NULL )
    {
        write(sockfd, sendline, strlen(sendline));
        if(read(sockfd, recvline, 1024) <= 0 )
        {
            printf("server terminated\n");
        }

        fputs(recvline, stdout);
    }
}
int main(int argc , char** argv)
{
    int sockfd;
    struct sockaddr_in seraddr;

    if(argc !=2)
    {
        printf("argc error\r\n");
    }

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("socket error\r\n");
    }

    bzero(&seraddr, sizeof(seraddr));
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(13000);
    if((inet_pton(AF_INET, argv[1], &seraddr.sin_addr)) < 0)
    {
        printf("inet_pton error\r\n");
    }

    if(connect(sockfd, (struct sockaddr*)&seraddr, sizeof(seraddr)) < 0)
    {
        printf("connect error\r\n");
    }

    str_cli(stdin, sockfd);
    return 0;
}

server 代码

#include <time.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <stdlib.h>
void str_echo(int sockfd)
{

    ssize_t n;
    char buf[1024];

    while((n = read(sockfd, buf, 1024)) > 0 )
    {
        write(sockfd, buf, n);
    }

    if(n < 0)
    {
        printf("read error\r\n");
    }
}

int main(int argc, char** argv)
{
    int listenfd, connectfd;
    socklen_t client_len;
    struct sockaddr_in servaddr, client_addr;
    pid_t childpid;

    if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("sock error\r\n");
        return 0;
    }

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(13000);
    servaddr.sin_addr.s_addr = inet_addr("0.0.0.0");

    if( bind(listenfd, (struct sockaddr* )&servaddr, sizeof(servaddr)) < 0)
    {
        printf("bind error\r\n");
        return 0;
    }

    if(listen(listenfd, 0) < 0)
    {
        printf("listen error\r\n");
        return 0;
    }

    for( ; ;)
    {
        client_len = sizeof(client_addr);
        connectfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_len);

        if( (childpid = fork())== 0)
        {
            close(listenfd);
            str_echo(connectfd);
            exit(0);
        }

        close(connectfd);
    }
}
以下是一个使用lwIP Raw API构建的TCP服务器完整程序示例: ```c #include "lwip/tcp.h" // TCP服务器端口号 #define TCP_PORT 8080 // TCP服务器接收连接的回调函数 err_t accept_callback(void *arg, struct tcp_pcb *newpcb, err_t err) { // 设置TCP服务器接收数据的回调函数 tcp_recv(newpcb, recv_callback); return ERR_OK; } // TCP服务器接收数据的回调函数 err_t recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { if (p == NULL) { // 对方已经关闭连接 tcp_close(tpcb); return ERR_OK; } // 处理接收到的数据 // ... // 释放pbuf pbuf_free(p); return ERR_OK; } int main() { struct tcp_pcb *tcp_server; // 初始化lwIP协议栈 lwip_init(); // 创建TCP服务器 tcp_server = tcp_new(); tcp_bind(tcp_server, IP_ADDR_ANY, TCP_PORT); tcp_listen(tcp_server); tcp_accept(tcp_server, accept_callback); // 启动lwIP协议栈 while (1) { sys_check_timeouts(); } return 0; } ``` 在这个例子中,我们使用lwIP Raw API创建了一个TCP服务器。在main函数中,我们首先初始化了lwIP协议栈。然后,我们创建了一个TCP服务器,绑定到指定的端口号并开始监听。当有客户端发起TCP连接请求时,我们会调用accept_callback函数来处理连接请求,并设置TCP服务器接收数据的回调函数为recv_callback。在recv_callback函数中,我们处理接收到的数据,然后释放pbuf。最后,在主循环中,我们调用sys_check_timeouts函数来检查lwIP协议栈中的定时器事件。 需要注意的是,这个例子中省略了一些错误处理和释放资源的代码,实际使用时需要添加。同时,为了使服务器能够处理并发连接,我们需要使用多个tcp_pcb结构体来管理多个连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值