网络编程须懂点网络的基本概念,趁着这个学期学习网络原理,把网络编程熟悉熟悉,刚接触网络编程,有错误的地方,希望大家多多指正。
通过使用套接字来达到进程间通信目的编程就是网络编程。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();
}