为写“QQ“做准备------(1)网络编程

来源:互联网 发布:剑网三叽萝捏脸数据 编辑:程序博客网 时间:2024/05/17 08:46

网络编程须懂点网络的基本概念,趁着这个学期学习网络原理,把网络编程熟悉熟悉,刚接触网络编程,有错误的地方,希望大家多多指正。

通过使用套接字来达到进程间通信目的编程就是网络编程。windows提供的基于网络编程的就是套接字也就是winsock.

以下是基于C语言编译的一个本机即时聊天工具,其实非常简单,就是建立两个工程,一个是服务端service,一个是客户端client,只要用套接字socket将其连接起来,就可以实现。同时进程间通信有基于面向连接(连接导向)的、可靠的、基于字节流TCP,或是基于无连接的传输层协议UDP,这里是用TCP实现的。

先把功能介绍一下吧!

当client发送一个消息(my name is client)给 service时,service收到,service再发送消息给client(my name is service)

1.你必须做好准备工作哦,那就是加载头文件winsock2.h,和库ws2_32.lib.

以下是工程代码,但希望不要直接复制,粘贴哦!另外,我的这个程序存在一点问题(消息是由client先发出)

希望各位大侠给我指出错误,谢谢啦!--------------------一起学习,天天向上。

1.service端代码

#include<stdio.h>#include<stdlib.h>#include<winsock2.h>void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) {        return;}if ( LOBYTE( wsaData.wVersion ) != 1||        HIBYTE( wsaData.wVersion ) != 1 ){WSACleanup( );return; }SOCKET sock=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN  addrser;addrser.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//htonl主机字节序转变成网络字节序。addrser.sin_family=AF_INET;addrser.sin_port=htons(6000);bind(sock,(SOCKADDR*)&addrser,sizeof(SOCKADDR));listen(sock,5);SOCKADDR_IN  addrclient;int len=sizeof(SOCKADDR);SOCKET  sockclient=accept(sock,(SOCKADDR*)&addrclient,&len);while(1){char  sendstr[100];char  buffrec[100];recv(sockclient,buffrec,strlen(buffrec)+1,0);char  buff[200];sprintf(buff,"  %s  say: %s ",inet_ntoa(addrclient.sin_addr),buffrec);printf("%s\n",buff);printf("please  input :\n");gets(sendstr);send(sockclient,sendstr,strlen(sendstr)+1,0);}closesocket(sockclient);WSACleanup();}

2.client端代码

#include<stdio.h>#include<stdlib.h>#include<winsock2.h>void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) {        return;}if ( LOBYTE( wsaData.wVersion ) != 1||        HIBYTE( wsaData.wVersion ) != 1 ){WSACleanup( );return; }SOCKET sockclient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN  addrser;addrser.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//htonl主机字节序转变成网络字节序。addrser.sin_family=AF_INET;addrser.sin_port=htons(6000);connect(sockclient,(SOCKADDR*)&addrser,sizeof(SOCKADDR));char  recvbuff[100];char  sendbuff[100];char  tempbuff[200];while(1){printf("please  input:\n");gets(sendbuff);send(sockclient,sendbuff,strlen(sendbuff)+1,0);recv(sockclient,recvbuff,strlen(recvbuff)+1,0);sprintf(tempbuff,"%s  say:%s \n ",inet_ntoa(addrser.sin_addr),recvbuff);printf("%s",tempbuff);}closesocket(sockclient);WSACleanup();}