SOCKET TCP 编程

   最近一直在用Qt编一个聊天工具,现在界面终于是差不多了,但是在socket编程与多线程编程中碰到了许多问题,不知道从何处着手了。

 

  之前有在linux终端下编写过socket通信的QQ程序,在接触Qt 之前以为这个模块差不多可以照搬的,结果大出我意料,根本就不一样,怎么照搬啊……

 

  下面,主要总结一下在C语言下的SOCKET 中TCP的编程:

  以我的学习方法来写吧……

   首先来讲一下xsocket通信的基本步骤:

   首先对于服务器端:新建socket对象->bind进行绑定->send进行信息的发送->recv开始接收信息->关闭服务器;

   对于客户机端来说:新建socket对象->bind绑定->接收来自服务器的信息->向服务器发送信息->关闭客户机端。

 

   我也不想讲废话了,贴两个程序吧,一个是服务器端的,一个是客户机端的,运行体会一下吧……

 

    server.c

 

/************************程序*******************************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
    int server_sockfd , client_sockfd;
    int server_len,client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;
    int byte;
    char char_recv[100], char_send[100];
    server_sockfd = socket(AF_INET, SOCK_STREAM,0);
    server_address.sin_addr.s_addr=inet_addr("127.0.0.1");
    server_address.sin_port=9734;
    server_len = sizeof(server_address);
    bind(server_sockfd,(struct sockaddr *)&server_address, server_len);
    listen(server_sockfd,5);
    printf("server waiting for connect /n");
    client_len=sizeof(client_address);
    client_sockfd=accept(server_sockfd, (struct sockaddr *)&client_address, (socklen_t *)&client_len);

    if((byte=recv(client_sockfd, char_recv, 100, 0))== -1)//接收消息
    {
        perror("recv");
        exit(EXIT_FAILURE);
    }
    printf("receive from client is %s /n",char_recv);
    printf("please input the message you wanna send:");
    gets(char_send);

    if((byte=send(client_sockfd,char_send,100,0))==-1)
    {
        perror("send");
        exit(EXIT_FAILURE);
    }
    shutdown(client_sockfd,2);
    shutdown(server_sockfd,2);
}



client.c

/****************************程序*****************************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv)
{
    int sockfd;
    int len;
    struct sockaddr_in address;
    int result;
    int byte;
    char char_recv[100], char_send[100];
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
    //新建对象,AF_INET表示使用IP协议簇,SOCK_STREAM表示面向连接的TCP协议
    {
        perror("socket");
        exit(EXIT_FAILURE);
    }
    address.sin_family=AF_INET;
    address.sin_addr.s_addr = inet_addr("127.0.0.1");//该IP地址表示是本机的IP地址,即进行本机对本机的socket传送
    address.sin_port=9734;
    len=sizeof(address);
    if((result = connect(sockfd, (struct sockaddr *)&address, len))==-1)
    {
        perror("connect");
        exit(EXIT_FAILURE);
    }
    printf("please input the string you sended :");
    gets(char_send);
    if((byte=send(sockfd,char_send,100,0))==-1)
    {
        perror("send");
        exit(EXIT_FAILURE);
    }

    if((byte=recv(sockfd,char_recv,100,0))==-1)
    {
        perror("recv");
        exit(EXIT_FAILURE);
    }
    printf("receive from server is %s /n",char_recv);
    close(sockfd);
    exit(0);
}

PS:开两个终端,先运行server.c再运行client.c。

至于在Q t中的socket编程,看了好多例子,但是都不是我想要的,讲得不详细、没条理、太哆嗦,再研究研究吧……







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值