最近一直在用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);
}
#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)
#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);
}
{
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编程,看了好多例子,但是都不是我想要的,讲得不详细、没条理、太哆嗦,再研究研究吧……