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


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

通过使用套接字来达到进程间通信目的编程就是网络编程。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();
}






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值