socket,linux用c语言实现 10

linux用c语言实现,编写tcp服务器和tcp客户端应用程序。要求实现客户端向服务器发送字符串,如”helloworld!”,服务器接收到客户端的字符串后回发相同的字符... linux用c语言实现,编写tcp服务器和tcp客户端应用程序。要求实现客户端向服务器发送字符串,如”hello
world!”,服务器接收到客户端的字符串后回发相同的字符串给客户端。
展开
 我来答
不屑宠儿
2013-12-08 · TA获得超过578个赞
知道小有建树答主
回答量:373
采纳率:0%
帮助的人:397万
展开全部

哦字符串回显啊unix网络编程有好几个版本,你可以去网上下它的源代码(百度搜UNIX网络编程 源代码),呃大部分被我的改的不成样了,发个能用的给看看吧

//server
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<signal.h>

#define SERVPORT 1956
#define MAXLINE 100

typedef void Sigfunc(int);

void sig_chld(int signo)
{
        pid_t pid;
        int stat;
        while( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
                printf("child %d terminated\n", pid);
        return;
}


//read data from client, and write back to them
void str_echo(int sockfd)
{
        ssize_t n;
        char buf[MAXLINE];
        again:
        while( (n = read(sockfd, buf, MAXLINE)) > 0 )
                write(sockfd, buf, n);

        if(n < 0 && errno ==EINTR)
                goto again;

        else if(n < 0 )
                printf("error\n");
}


int main(int argc, char** argv)
{
        int listenfd, connfd;
        socklen_t clilen;
        pid_t childpid;
        struct sockaddr_in servaddr, cliaddr;

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

        bzero(&servaddr, sizeof(servaddr));

        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(SERVPORT);
        if( bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) <0 )
        {
                printf("bind error\n");
                return -1;
        }

        int backlong = 0;
        if(listen(listenfd, backlong) <0 )
        {
                printf("listen error\n");
                return -1;
        }

        signal(SIGCHLD, sig_chld);
        for(;;)
        {
                clilen = sizeof(cliaddr);
                if( (connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen)) < 0)
                {
                        if(errno == EINTR)      continue;
                        else printf("accept error\n");
                        return 0;
                }
                printf("accept \n");
                if( (childpid = fork()) == 0 )
                {
                        close(listenfd);    //close child's listen socket
                        str_echo(connfd);
                        exit(0);
                }
                close(connfd);
        }
 }
//client
#include<stdio.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>


#define MAXLINE 10

int main(int argc, char ** argv)
{
        int sockfd, n;
        char recvline[MAXLINE+1];
        struct sockaddr_in servaddr,binaddr;

        if(argc != 2)
        {
                printf("usage: <IPADDRESS>\n");
                return -1;

        }

        if( (sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
        {
                printf("socket error\n");
                return -1;
        }

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(15);
        if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr)<=0 )    
        {
                printf("inet_pton error for &s \n", argv[1]);
                return -1;
        }

        int bindSock;



        binaddr.sin_family = AF_INET;
        inet_pton(AF_INET, "222.26.224.56", &binaddr.sin_addr);
        binaddr.sin_port = htons(20000);

        int reuse0 = 1;
        if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse0, sizeof(reuse0)) == -1)
        {

                printf("set socket error\n");
                return -1;
        }

        if( bind(sockfd, (struct sockaddr *)&binaddr, sizeof(servaddr)) <0 )
        {
                printf("bind error\n");
                return -1;
        }


        if( connect(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr) ) < 0 )
        {
                printf("connection refuse\n");
                return -1;
        }
        while( (n = read(sockfd, recvline, MAXLINE)) > 0 )
        {
                recvline[n] = 0;
                if(fputs(recvline, stdout) == EOF)
                {
                        printf("fputs error");
                        return -1;
                }
                printf("\n");
        }

        if(n < 0 )
        {
                printf("read error");
                return -1;
        }
}
百度网友bab7c74
2013-12-08 · TA获得超过126个赞
知道答主
回答量:125
采纳率:100%
帮助的人:112万
展开全部
不难吧,我给你说下流程
客户端
1、创建socket套接子s
2、用s连接到服务端,connect这个函数,成功返回0,错误 -1;
3、可以发送和接收数据,看你是面向连接还是无连接的了,具体的你自己处理
服务端
1、创建socket,比如s
2、绑定端口和本级IP。bind
3、listen。监听端口
4、accept,接受服务端连接,如果成功的话会返回一个新套接字的,比如s1,你可以利用s1和客户端进行通信,接收和发送和客户端的一样

还有需要提醒的是,你使用面向无连接的时候客户端和服务端差不多是一样的工作流程,都和上边服务端工作模式一样
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式