One thing I would suggest would be to set this up as a .vbs script file to read the entries from a table in the database, then update a field that signifies either te last date checked or a boolean for whether they had your link or not (or both).
Then it would be nothing to build a simple viewing page that let you view all the links or all the links that didn't link back.
The reason I say use a vbs file is because then you could schedule it to run using Windows Scheduler, maybe have it run Monday at 1am or something. That automates the process and gets around any timeout issues you would have by executing the checks from an ASP page.
I think I would suggest the table be set up something like:
LinkTable
site_id - autoincrementing counter
site_address - text/varchar
last_change - Date/Time
site_available - boolean
site_had_link - boolean
Note: I decided that rather then just list the last run (which would be obvious if you have it scheduled) that the date filed will now hold the last time this changed, so perhaps it fails 4 weeks in a row you would see that the link had not been added in 4 weeks or something to that effect.
Obviously if you already have the links in the database you could trim this table down to just link to that existing link table, but anyways, working with this as an example:
Code:
[b]ReciprocalCheck.vbs[/b]
'----- Define Globals
'Create three variable to define state of query:
'three variable to define the states
Const PASS = 0
Const FAIL = 1
Const UNAVAIL = 2
Const YOUR_ADDRESS = "your-address-here.com"
'----- Get Data From DB
Dim sql_links, rs_links, conn
Set conn = CreateObject("ADODB.Connection")
conn.Open "your connection string"
sql_links = "SELECT site_id, site_address FROM YourTable"
Set rs_links = conn.Execute(sql_links"
'dump data into array so we can close connection while evaluating links
Dim arr_links
Set arr_links = rs_links.GetRows()
Set rs_links = Nothing
conn.Close
'----- Run Link Checks
'build three variables to hold ids of those that pass, those that don't pass, and those that aren't available
Dim str_pass, str_unavail, str_fail
'counter used to loop through array and results of call to check function
Dim link_ctr, result
'loop through array running checks on each link
For link_ctr = 0 to UBound(arr_links,2)
result = CheckLink(arr_links(1,link_ctr))
Select Case result
Case PASS
str_pass = str_pass & arr_links(0,link_ctr) & ","
Case FAIL
str_fail = str_fail & arr_links(0,link_ctr) & ","
Case UNAVAIL
str_unavail = str_unavail & arr_links(0,link_ctr) & ","
Case Else
'this is an error case tat should never occur, maybe have it write to an error log or something
End Select
Next
'now we have three lists of ID's. Trim off the final comma from each one if it has entries:
If len(str_pass) > 0 Then str_pass = Left(str_pass,len(str_pass) - 1)
If len(str_fail) > 0 Then str_fail = Left(str_fail,len(str_fail) - 1)
If len(str_fail) > 0 Then str_fail = Left(str_fail,len(str_fail) - 1)
'----- Update Database
'Now re-open the connection and execute 3 update statements
conn.Open "your connection string"
'So basically you only have to commit 3 updates now and it only updates
' the records in the list if there status (availability + had_link) had
' changed from there last entry.
conn.Execute "UPDATE YourTable SET last_change = Now(), site_available = True, site_had_link = True WHERE link_id IN (" & str_pass & ") And (site_had_link = False OR site_available = False)"
conn.Execute "UPDATE YourTable SET last_change = Now(), site_available = False, site_had_link = True WHERE link_id IN (" & str_unavail & ") And (site_had_link = False OR site_available = True)"
conn.Execute "UPDATE YourTable SET last_change = Now(), site_available = True, site_had_link = False WHERE link_id IN (" & str_fail & ") And (site_had_link = True OR site_available = False)"
'Now Clean up
conn.Close()
Set conn = Nothing
'----- Function: CheckLink
' Returns UNAVAIL, PASS, or FAIL if the linking page is unavailable,
' has the link, or does not have the link
Function CheckLink(address)
Dim objXMLHTTP, content
Set objXMLHTTP = CreateObject("Microsoft.XMLHTTP")
objXMLHTTP.Open "GET", address, False
objXMLHTTP.setRequestHeader "User-Agent","Googlebot/2.1+(+[URL unfurl="true"]http://www.googlebot.com/bot.html)"[/URL]
objXMLHTTP.Send
If objXMLHTTP.status <> 200 Then
CheckLink = UNAVAIL
Else
content = objXMLHTTP.ResponseText
If InStr(content,YOUR_ADDRESS) > 0 Then
CheckLink = PASS
Else
CheckLink = FAIL
End If
End If
Set objXMLHTTP = Nothing
End Function
I hadn't planned on writing all of the coee, but oh well

Not sure it is capable of running the first time, i wrote in on the fly (and it needs connections strings and a dtaabse and table).
Basically by placing this in a .vbs file you get several advantages:
1) No timeout issues like you would with an ASP page trying to run many many checks
2) The capability to schedule it
You could then build a viewing page that simply allowed you to view everything that had failed or everything that had been unavailable.
if you really anted to know without having to remember to check a website you could add some CDO code to this and either send yourself an email with all of the offending site addresses or add some more fields to your table and send an email to the people that took your link down
Anyways, hope this proves helpful,
-T
01000111 01101111 01110100 00100000 01000011 01101111 01100110 01100110 01100101 01100101 00111111
Help, the rampaging, spear-waving, rabid network gnomes are after me!