基本tcp socket编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fyq201749/article/details/74054695

在linux系统中tcp套接字编程,本例是客户端向服务器发送一条消息,服务器将消息接受后又发送给客户端,是在ubuntu虚拟机上运行的。不说废话了直接上代码。首先是服务器,服务器要先socket(),再初始化结构体,再bind(),再listen()监听客户端的连接,循环accept()接受客户端的连接,处理数据。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>//sockaddr_in
#include <stdlib.h>
#include <string.h>//strlen
#include <unistd.h>//read ,write
#include <errno.h>
#include <sys/types.h>
int main(int argc,char ** argv){
    int sockfd,connfd,n;//本地套接字连接符号,客户端连接符号,接收数据的长度
    socklen_t len;
    struct sockaddr_in servaddr,cliaddr;//服务器、客户端结构地址
    char buff[100];//接收数据的数组
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){//创建套接字
        printf("socket error"); 
        exit(0);
    }
    bzero(&servaddr,sizeof(servaddr));//初始化套接字
    servaddr.sin_family = AF_INET;//ipv4版本
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//本机地址
    servaddr.sin_port = htons(4399);//端口号   

    bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));//绑定端口

    listen(sockfd,5);//监听端口,第二个参数写5就好

    while(1){

        len = sizeof(cliaddr);
        if((connfd = accept(sockfd,(struct sockaddr *)NULL,NULL))<0){//接受客户端的连接
            printf("error");
            continue;
        }
        if(!fork()){//这一段是并发服务器的写法,如果使用迭代的话把fork()函数去掉
            n = recv(connfd,buff,100,0);//从客户端接受数据
            send(connfd,buff,n,0);//向客户端发送数据
            close(connfd);//子进程关闭套接字
        }
        buff[n] = '\0';
        printf("recv from cli %s",buff);
        close(connfd);//父进程关闭套接字开始下一轮的处理
    }
    return 0;

然后是客户端,socket(),再初始化结构体,再connet(),再获取键盘读入的数据, send()/write()发送数据,recv()/read()接收数据,下面是代码。

#include <stdio.h>
#include <stdlib.h>// 基本头文件
#include <sys/socket.h>//socket()
#include <netinet/in.h>//struct sockaddr_in
#include <unistd.h>
#include <string.h>//strlen()函数
#include <arpa/inet.h>//inet_pton()函数
#include <errno.h>
int main(int argc,char ** argv){
    int sockfd,conn,n;
    char buff[100],sd[100];//接受和发送数据的数组
    struct sockaddr_in cliaddr;//服务器结构地址
    if(argc!=2){
        printf("ip address");
        exit(0);
    }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){//创建套接字
        printf("socket error");
        exit(0);
    }
    bzero(&cliaddr,sizeof(cliaddr));//初始化结构地址
    cliaddr.sin_family = AF_INET;//ipv4版本
    cliaddr.sin_port = htons(4399);//端口号
    if(inet_pton(AF_INET,argv[1],&cliaddr.sin_addr)<0){//将从键盘传入的IP参数赋值给&server.sin_addr.s_addr
        printf("error");    
        exit(0);
    }
    if((conn=connect(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr)))<0){//连接服务器
        printf("cerror");
        exit(0);
    }
    fgets(sd,100,stdin);//从键盘读入数据
    if(send(sockfd,sd,strlen(sd),0)<0){//向服务器发送数据
        printf("send error");
        exit(0);
    }
    if((n=recv(sockfd,buff,100,0))<0){//从服务器接受数据
        printf("recv error");
        exit(0);
    }
    buff[n] = '\0';
    printf("%s",buff);
    close(sockfd);
    return 0;
}

运行结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/fyq201749/article/details/74054695